java設計模式-策略模式一
阿新 • • 發佈:2019-01-05
一,定義:Strategy模式也叫策略模式是行為模式的一種,它對一系列的演算法加以封裝,為所有的演算法定義一個抽象的演算法介面,並通過繼承該抽象演算法介面對所有的演算法加以封裝和實現,具體的演算法選擇交有客戶端決定(策略)。Strategy模式主要有外部環境來決定演算法的切換。
二,結構:
- 封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模組對策略的直接呼叫。
- 抽象策略:通常情況下為一個介面,當各個實現類中存在著重複的邏輯時,則使用抽象類來封裝這部分公共的程式碼,此時,策略模式看上去更像是模版方法模式。
- 具體策略:具體策略角色通常由一組封裝了演算法的類來擔任,這些類之間可以根據需要自由替換。
三,演示:
抽象策略
public interface IStrategy {
public int cost(double money);
}
具體策略類
public class ProductA implements IStrategy { //商品A如果是購買的商品A,滿100元10元。 @Override public double cost(double money) { System.out.println("我在購買商品A"); if(money>100){ return money-10; } return money; } }
public class ProductB implements IStrategy {
//商品B如果是購買的商品B,滿100元0.85折。
@Override
public double cost(double money) {
System.out.println("我在購買商品B");
if(money>100){
return money*0.85;
}
return money;
}
}
封裝類
public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy; } public double cost(double money) { return this.strategy.cost(money); } }
客戶端呼叫:
public class MainClass {
public static void main(String[] args){
Context s=new Context(new ProductA());
double cost = s.cost(120);
System.out.println("實際花費:"+cost);
Context s1=new Context(new ProductB());
double cost1 = s1.cost(120);
System.out.println("實際花費:"+cost1);
}
}
策略模式缺點:
1. 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於客戶端知道所有的演算法或行為的情況。
2. 策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態儲存到客戶端裡面,而將策略類設計成可共享的,這樣策略類例項可以被不同客戶端使用。換言之,可以使用享元模式來減少物件的數量。
總結:策略設計模式是有外部來確定具體的策略類的演算法邏輯,例如常見的泛型ArrayList<T>就是策略設計模式(不夠嚴謹僅供理解),由外部呼叫者確定。