小A:“策略模式應該怎麼去應用它?”
大B:“1、如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態的讓一個物件在許多行為中選擇一種行為。2、如果系統需要動態地在幾種演算法中選擇一種。那麼這些演算法可以包裝到一個個的具體演算法類裡面,而這些演算法類都是一個抽象演算法類的子類。3、一個系統的演算法使用的資料不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復發的和只與演算法有關的資料。”
使用案例:
AWT中的LayoutManager,Swing中的Border.
程式碼例子
1、抽象策略
package.eekq.strategy;
publicinterfaceIStrategy{
/**策略方法*/
publicabstractdoubleadd();
}
2、具體策略,這裡我以兩個具體策略為例
package.eekq.strategy;
publicclassConcreteStrategy1implementsIStrategy{
/**示意性演算法*/
publicdoubleadd(){
//TODO自動生成方法存根
System.out.println(this.getClass().getName()+“的加法運算”);
return0;
}
}
package.eekq.strategy;
publicclassConcreteStrategy2implementsIStrategy{
publicdoubleadd(){
//TODO自動生成方法存根
System.out.println(this.getClass().getName()+“的加法運算”);
return0;
}
}
3、環境角色
package.eekq.strategy;
publicclassContext{
/**環境角色類*/
privateIStrategystrategy;
publicContext(IStrategystrategy){
this.strategy=strategy;
}
/**策略方法*/
publicdoubleadd(){
this.strategy.add();
return0;
}
}
4、客戶端呼叫
package.eekq.strategy;
publicclassMain{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODO自動生成方法存根
Contextcontext=newContext(newConcreteStrategy1());
context.add();//執行演算法。
context=newContext(newConcreteStrategy2());
context.add();//執行演算法。
}
}
5、執行結果:
.eekq.strategy.ConcreteStrategy1的加法運算
.eekq.strategy.ConcreteStrategy2的加法運算