《設計模式之禪》讀書筆記-策略模式

策略模式(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 判斷,如果判斷條件內執行代碼過多就可以拿到策略模式來做

  • 算法需要自由切換的場景。

這個比較好理解,指的是具體用那種策略是根據入參來決定的

  • 需要屏蔽算法規則的場景。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章