天天看點

設計模式-政策模式

設計模式-政策模式

Strategy:抽象出要做什麼

ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC:具體的實作,實作出要做的事情,

Context:維護一個對Strategy對象的引用。可定義一個接口來讓Strategy通路它的資料。

政策模式的定義:定義算法家族,分别封裝起來,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。

定義算法家族-Strategy,抽象出做什麼

分别封裝起來-ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC 每種算法都封裝起來

互相替換-Context:維護一個對Strategy對象的引用

仔細品這三行話,就能了解為什麼說政策模式是封裝變化的。

給個例子:

/**
 * @author wrj
 * @description
 * @Date 2021/12/2 4:02 下午
 */
//抽象出要說什麼
interface SaySomeThing{

    public void say();
}
//真的要說什麼1
class SayOne implements SaySomeThing{
    @Override
    public void say() {
        System.out.println("吔屎啦,梁非凡");
    }
}
//真的要說什麼2
class SayTwo implements SaySomeThing{
    @Override
    public void say() {
        System.out.println("你知道我這五年是怎麼過的嗎?");
    }
}
//将說什麼封裝起來,對外暴露一個方法,内部自己去調真正說什麼
class SayContext{
    private SaySomeThing say;

    public SayContext(SaySomeThing say) {
        this.say = say;
    }

    public void contextInterface(){
        say.say();
    }
}

public class StrategyTest2{
    public static void main(String[] args) {
        SayContext context1 = new SayContext(new SayOne());
        context1.contextInterface();

        SayContext context2 = new SayContext(new SayTwo());
        context2.contextInterface();
    }
}      

例子中 我定義了一個說點什麼的接口

之後定義了兩個說什麼的實作

然後定義了context類,引用一個SaySomeThing的執行個體,并且提供一個接口,去調用執行個體中的say()方法

這樣,測試時,不管我怎麼換具體的實作,測試的代碼是不用變的

回過頭來在品一下,政策模式封裝變化,讓他們之間可以互相替換

你了解了嗎?