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