网站开发tt0546,网站浏览图片怎么做,网络建设方案ppt,中国新闻社邮箱策略模式 问题描述#xff1a;
有各种鸭子(北京鸭、玩具鸭)#xff0c;鸭子有各种行为(叫、飞)希望能够实现不同的鸭子#xff0c;显示不同鸭子的信息
传统方法会创建一个抽象类 public abstract class Duck{public Duck(){}public abstract void display();//显示鸭子信… 策略模式 问题描述
有各种鸭子(北京鸭、玩具鸭)鸭子有各种行为(叫、飞)希望能够实现不同的鸭子显示不同鸭子的信息
传统方法会创建一个抽象类 public abstract class Duck{public Duck(){}public abstract void display();//显示鸭子信息public void fly(){System.out.println(鸭子会飞翔);}}这时候我们要实现具体的鸭子如玩具鸭得重写Duck类里的所有方法因为玩具鸭不会飞。如果要实现北京鸭又得重写Duck类里的所有方法因为北京鸭飞飞行能力一般。
传统方式存在问题
其他鸭子都继承了Duck类所有fly让所有的子类都会飞了这是不正确的即继承带来的问题对类的局部改动尤其超类的局部改动会影响其他部分会有溢出效应 这时引出策略模式
策略模式中定义算法族(策略组)分别封装起来让他们之间可以相互替换此模式让算法的变化独立于使用算法的客户。
我的理解是 把原来继承的部分换成一个插槽这个插槽在策略模式中是一个接口。不同的类插槽处的具体实现不一样这时候我们可以搭建很多个不一样的积木(策略组)用哪一个就把哪一个积木放到插槽里不用对插槽进行重新改动这样后面的其他人也可以重复使用这个积木。策略模式中具体的实现是积木即继承了接口的实现类使用哪一个实现了就将其赋值给接口即可不用重新接口方法。
实例 策略模式的原则就是分离变化部分封装接口基于接口编程各种功能。
将原来的方法定义改成策略接口(创建一个插槽)
public abstract class Duck{//属性策略接口FlyBehavior flyBehavior;public abstract void display();//显示鸭子信息public void fly(){//改进if(flyBehavior!null){flyBehavior.fly();}}//提供给用户动态变化行为动作(更换插槽里的积木调用这个方法就行)public void setFlyBehavior(FlyBehavior flyBehavior){this.flyBehavior flyBehavior;}
}策略接口
public interface FlyBehavior {void fly();//子类的具体实现
}策略组的实现(实现放到接口里的积木)
public class GoodFlyBehavior implements FlyBehavior{Overridepublic void fly() {System.out.println(飞翔技术高超);}
}public class NoFlyFlyBehavior implements FlyBehavior{Overridepublic void fly() {System.out.println(不会飞翔);}
}不同鸭子的实现
public class ToyDuck extends Duck{Overridepublic void display() {//把想放的积木放到插槽里flyBehavior new NoFlyFlyBehavior();}
}public class BeiJingDuck extends Duck{Overridepublic void display() {flyBehavior new GoodFlyBehavior();}
}即将项目中变化的部分分离出来多用组合/聚合少用继承用行为类组合而不是行为的继承。
体现了“对修改关闭对扩展开放”原则客户端增加行为不用修改原有代码只需要添加一种策略即可。
需要注意的是没添加一个策略就需要增加一个类当策略过多是会导致类数目庞大。