策略模式(Strategy):定義了一組算法器紧,將每個(gè)算法都封裝起來叠纹,并且使它們之間可以互換跨新。UML結(jié)構(gòu)圖如下:
Context是上下文剃盾,用一個(gè)ConcreteStrategy來配置,維護(hù)一個(gè)對Strategy對象的引用琉朽;Strategy是策略類毒租,用于定義所有支持算法的公共接口;ConcreteStrategy是具體策略類箱叁,封裝了具體的算法或行為蝌衔,繼承于Strategy。
1. Context上下文
Context上下文角色蝌蹂,也叫Context封裝角色噩斟,起承上啟下的作用,屏蔽高層模塊對策略孤个、算法的直接訪問剃允,封裝可能存在的變化。
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void contextInterface() {
strategy.algorithmInterface();
}
}
2. 策略角色
抽象策略角色齐鲤,是對策略斥废、算法家族的抽象,通常為接口给郊,定義每個(gè)策略或算法必須具有的方法和屬性牡肉。algorithm是“運(yùn)算法則”的意思。
public abstract class Strategy {
//算法方法
public abstract void algorithmInterface();
}
3. 具體策略角色
用于實(shí)現(xiàn)抽象策略中的操作淆九,即實(shí)現(xiàn)具體的算法统锤,下方用print代替毛俏。測試類共3個(gè)ConcreteStrategy,其它兩個(gè)類與ConcreteStrategyA同理饲窿,就不再贅述了煌寇。
public class ConcreteStrategyA extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法A實(shí)現(xiàn)");
}
}
4. Client客戶端
依次更換策略,測試一下策略模式逾雄。
public class Client {
public static void main(String[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
context = new Context(new ConcreteStrategyC());
context.contextInterface();
}
}
在實(shí)際使用中阀溶,遇到需要進(jìn)行多個(gè)條件判斷的業(yè)務(wù)規(guī)則時(shí)妓羊,可以考慮采用策略模式分瘦,與簡單工廠結(jié)合,根據(jù)不同的業(yè)務(wù)規(guī)則遭京,創(chuàng)建同一個(gè)類的不同子對象做鹰,還可以與反射結(jié)合击纬。