行爲型設計模式 - 策略模式詳解

基本介紹

策略模式(Strategy Pattern):定義一系列算法,將每個算法封裝起來,並讓它們能夠相互替換。策略模式讓算法獨立於使用它的客戶而變化,是一種對象行爲型模式。html

模式結構

Context(環境角色):持有抽象策略角色的引用java

Strategy(抽象策略角色):給出全部具體策略類所需的接口算法

ConcreteStrategy(具體策略角色):包裝了相關的算法或行爲安全

舉例說明

鴨子分爲野生和家養,野生鴨子會飛,而家養鴨子不會飛。使用策略模式來是實現,能夠將「飛」定義爲一個抽象策略,具體策略就是「會飛」、「不會飛」數據結構

一、抽象策略角色ide

public interface FlyBehavior {
    void fly();
}

二、具體策略角色測試

public class CanFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("能夠飛");
    }
}

public class NotFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("不會飛");
    }
}

三、環境角色this

//鴨子類
public abstract class Duck {

    private FlyBehavior flyBehavior;

    public Duck(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void fly(){
        flyBehavior.fly();
    }

    public abstract void description();
}

//野生鴨子
public class WildDuck extends Duck {

    public WildDuck(FlyBehavior flyBehavior) {
        super(flyBehavior);
    }

    @Override
    public void description() {
        System.out.println("我是野生鴨子");
    }
}

//家養鴨子
public class DomesticDuck extends Duck {

    public DomesticDuck(FlyBehavior flyBehavior) {
        super(flyBehavior);
    }

    @Override
    public void description() {
        System.out.println("我是家養鴨子");
    }
}

四、測試類code

public class Client {
    @Test
    public void test(){
        Duck duck1 = new WildDuck(new CanFlyBehavior());
        duck1.description();
        duck1.fly();
        Duck duck2 = new DomesticDuck(new NotFlyBehavior());
        duck2.description();
        duck2.fly();
    }
}

五、運行結果htm

我是野生鴨子
能夠飛
我是家養鴨子
不能飛

模式分析

優勢:

  • 易於擴展。策略模式提供了對「開閉原則」的完美支持,用戶能夠在不修改原有系統的基礎上選擇算法或行爲,也能夠靈活地增長新的算法或行爲。
  • 策略模式提供了管理相關的算法族的辦法。
  • 使用聚合或組合替換了繼承,下降耦合。
  • 使用策略模式能夠避免使用多重條件轉移語句。

缺點:

  • 客戶端必須知道全部的策略類,並自行決定使用哪個策略類。
  • 可能會產生不少策略類,能夠經過使用享元模式在必定程度上減小對象的數量。

適用場景:

  • 若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲。
  • 一個系統須要動態地在幾種算法中選擇一種。
  • 若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。
  • 不但願客戶端知道複雜的、與算法相關的數據結構,在具體策略類中封裝算法和相關的數據結構,提升算法的保密性與安全性。

參考:https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html

相關文章
相關標籤/搜索