策略模式(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