策略模式
一、策略模式(Strategy Pattern)
1.基本介绍
1)策略模式中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2)这算法体现了几个设计原则:
把变化的代码从不变的代码中分离出来
针对接口编程而不是具体类(定义了策略接口)
多用组合/聚合,少用继承(客户通过组合方式使用策略)
2.原理类图
二、应用实例
1.实例要求
1)有各种鸭子(比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等)
2)显示鸭子的信息
2.思路分析
3.代码实现
public class Client { public static void main(String[] args) { WildDuck wildDuck = new WildDuck(); wildDuck.fly();// ToyDuck toyDuck = new ToyDuck(); toyDuck.fly(); PekingDuck pekingDuck = new PekingDuck(); pekingDuck.fly(); //动态改变某个对象的行为, 北京鸭 不能飞 pekingDuck.setFlyBehavior(new NoFlyBehavior()); System.out.println("北京鸭的实际飞翔能力"); pekingDuck.fly(); } }
public abstract class Duck { //属性, 策略接口 FlyBehavior flyBehavior; //其它属性<->策略接口 QuackBehavior quackBehavior; public Duck() {} public abstract void display();//显示鸭子信息 public void quack() { System.out.println("鸭子嘎嘎叫~~"); } public void swim() { System.out.println("鸭子会游泳~~"); } public void fly() { //改进 if(flyBehavior != null) { flyBehavior.fly(); } } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
public class PekingDuck extends Duck { //假如北京鸭可以飞翔,但是飞翔技术一般 public PekingDuck() { flyBehavior = new BadFlyBehavior(); } @Override public void display() { System.out.println("~~北京鸭~~~"); } } public class ToyDuck extends Duck{ public ToyDuck() { flyBehavior = new NoFlyBehavior(); } @Override public void display() { System.out.println("玩具鸭"); } //需要重写父类的所有方法 public void quack() { System.out.println("玩具鸭不能叫~~"); } public void swim() { System.out.println("玩具鸭不会游泳~~"); } } public class WildDuck extends Duck { //构造器,传入FlyBehavor 的对象 public WildDuck() { flyBehavior = new GoodFlyBehavior(); } @Override public void display() { System.out.println(" 这是野鸭 "); } }
public interface FlyBehavior { void fly(); // 子类具体实现 } public class GoodFlyBehavior implements FlyBehavior { @Override public void fly() { System.out.println(" 飞翔技术高超 ~~~"); } } public class BadFlyBehavior implements FlyBehavior { @Override public void fly() { System.out.println(" 飞翔技术一般 "); } } public class NoFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println(" 不会飞翔 "); } }
三、策略模式注意事项
1)策略模式关键是:分析项目中变化部分与不变部分
2)客户端增加行为不用修改原有代码,只要添加一种策略即可。