策略模式在實際工作中我用到了策略模式,但為什麼要有環境角色呢?這裡我貼上英文對含義的介紹,The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable....
策略模式
在實際工作中我用到了策略模式,但為什麼要有環境角色呢?
這裡我貼上英文對含義的介紹,
The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
然後看看這種設計模式的組成,
一般的,策略模式主要分為以下三個角色:
1. 環境角色(Context):持有一個策略類引用
存在的優點:(1)必要時可以增加系統的安全性,減少代碼的冗餘(下文有詳解)。
2. 抽象策略(Strategy):定義了多個具體策略的公共介面,具體策略類中各種不同的演算法以不同的方式實現這個介面;Context使用這些介面調用不同實現的演算法。一般的,我們使用介面或抽象類實現。
3. 具體策略(ConcreteStrategy):實現抽象策略類中的相關的演算法或操作。
我貼上簡單的實現
抽象類(抽象策略)
public abstract class AbstractStrategy { public abstract void algorithm(); }
具體策略-A
public class ConcreteStrategyA extends AbstractStrategy { @Override public void algorithm() { System.out.println("Strategy A"); } }
具體策略-B
public class ConcreteStrategyB extends AbstractStrategy { @Override public void algorithm() { System.out.println("Strategy B"); } }
環境角色怎麼用的呢?
public class Context { private AbstractStrategy strategy; public Context(AbstractStrategy strategy) { this.strategy = strategy; } public void algorithm() { this.strategy.algorithm(); } }
使用的時候我們這樣用
public static void main(String[] args) { //Strategy Pattern Demo Context context = new Context(new ConcreteStrategyA()); context.algorithm(); context = new Context(new ConcreteStrategyB()); context.algorithm(); }
細心如你應該會想我使用如下代碼也能實現,Context的存在是為了什麼?
AbstractStrategy abstractStrategy = new ConcreteStrategyA(); abstractStrategy.algorithm(); abstractStrategy = new ConcreteStrategyB(); abstractStrategy.algorithm();
這裡我們看看第一種現象:
修改抽象策略中的方法
public abstract void algorithm(int number);
修改具體策略的實現
@Override public void algorithm(int number) { System.out.println(number); };
看到這裡你會不會覺得這個參數number有安全隱患,傳進來的合法嗎?於是我要判斷,so,你可以每個具體的策略中都寫一段相同的邏輯去判斷下,或者傳參時判斷下,那麼不想copy的你此刻是不是想找個地方統一判斷一把,是的Context(譯為上下文,在.NET中有DBContext。。。)此刻顯示出重要性,我們大可在構造函數中去判斷,那麼我們總結下Context的第一個優點:必要時可以增加系統的安全性,減少代碼的冗餘。還有什麼優點呢?需要我們自己去在實際的Coding中總結,希望大家共同探討。
這裡需要和工廠模式進行比較,加以區別。
- 創建型模式
- 單例模式
- 工廠模式
- 抽象工廠模式
- 創建者模式
- 原型模式
- 結構性模式
- 適配器模式
- 橋模式
- 組合模式
- 裝飾模式
- 外觀模式
- 享元模式
- 代理模式
- 行為型模式
- 職責鏈模式
- 模板方法模式
- 解釋器模式
- 命令模式
- 迭代器模式
- 中介者模式
- 備忘錄模式
- 觀察者模式
- 狀態模式
- 策略模式
- 訪問者模式