
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()方法
這樣,測試時,不管我怎麼換具體的實作,測試的代碼是不用變的
回過頭來在品一下,政策模式封裝變化,讓他們之間可以互相替換
你了解了嗎?