天天看點

《設計模式之禅》讀書筆記-政策模式

政策模式(Strategy Pattern):

定義一組算法,将每個算法都封裝起來,并且使他們之間可以互換。
對于政策模式來說了解清楚它三個角色的作用,基本就差不多了。

政策模式的三個角色:

  • Context封裝角色
    它也叫做上下文角色,起承上啟下封裝作用,屏蔽高層子產品對政策、算法的直接通路,封裝可能存在的變化。
  • Strategy抽象角色
    政策、算法家族的抽象,通常為接口,定義每個政策或算法必須具有的方法和屬性。
  • ConcreteStrategy具體政策角色
    實作抽象政策中的操作,含有具體的算法,即具體的政策實作。

    下面是代碼實作

package com.jd.current.strategy;

/**
 * 抽象的政策角色
 * @author zhengxun
 * @version 2017-05-06
 */
public interface Strategy {

    public void doSomething();
}      
package com.jd.current.strategy;

/**
 * 抽象的政策角色
 * @author zhengxun
 * @version 2017-05-06
 */
public interface Strategy {

    public void doSomething();
}      
package com.jd.current.strategy;

/**
 * 具體的政策1
 * @author zhengxun
 * @version 2017-05-06
 */
public class ConcreteStrategy1 implements Strategy{
    public void doSomething() {
        System.out.println("政策1");
    }
}      
package com.jd.current.strategy;

/**
 * 具體的政策2
 * @author zhengxun
 * @version 2017-05-06
 */
public class ConcreteStrategy2 implements Strategy{
    public void doSomething() {
        System.out.println("政策2");
    }
}      
package com.jd.current.strategy;

/**
 * 封裝角色
 * @author zhengxun
 * @version 2017-05-06
 */
public class Context {

    private Strategy strategy = null;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void doSometing(){
        this.strategy.doSomething();
    }
}      

政策模式的優點

  • 算法可以自由切換
隻要實作抽象政策,就可以通過Context對其進行調用
  • 避免使用多重條件判斷
  • 擴充性良好
添加一個政策僅僅實作接口就可以了

政策模式的缺點

  • 政策類數量增多
  • 所有的政策類都需要對外暴露

政策模式的使用場景

  • 多個類隻有在算法和行為上稍有不同的場景。
例如某些if 條件判斷 switch 判斷,如果判斷條件内執行代碼過多就可以拿到政策模式來做
  • 算法需要自由切換的場景。
這個比較好了解,指的是具體用那種政策是根據入參來決定的
  • 需要屏蔽算法規則的場景。

繼續閱讀