设计模式——策略模式
来源:互联网 发布:外交部段子 知乎 编辑:程序博客网 时间:2024/06/05 20:06
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
(1)找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
(2)针对接口编程,而不是针对实现编程
(3)多用组合,少用继承
使用组合建立的系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态的改变行为”,只要组合的行为对象符合正确的接口标准即可。
Demo:
package 策略模式;/** * 鸭子现在会将飞行和呱呱叫的动作“委托”别人处理,而不是使用定义在Duck类内的呱呱叫和飞行方法 * */public abstract class Duck {/** * 首先,在Duck类中加入两个实例变量,分别为flyBehavior,quackBehavior,声明为接口类型, * 每个鸭子对象都会动态的设置这些变量,以在运行时引用正确的行为类型。 * * 每只鸭子都会实现FlyBehavior和QuackBehavior接口对象 * */FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck() {// TODO Auto-generated constructor stub}public abstract void dispaly();/** * 鸭子对象不会亲自处理飞行和呱呱叫行为,而是委托给flyBehavior和quackBehavior引用的对象 * */public void performFly() {flyBehavior.fly();}public void performQuack() {quackBehavior.quack();}public void swim() {System.out.println("All ");}public void setFlyBehavior(FlyBehavior fb) {flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb) {quackBehavior = qb;}}
package 策略模式;/** * 所有飞行类都必须实现的接口 * */public interface FlyBehavior {public void fly();}
package 策略模式;/** * 所有叫声类都必须实现的接口 * */public interface QuackBehavior {void quack();}
package 策略模式;/** * 这是飞行类的实现。给不会飞行的鸭子使用 * */public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("我不能飞");}}
package 策略模式;/** * 火箭飞行方式 * */public class FlyRocketProwered implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("我能用火箭飞行");}}
package 策略模式;/** * 这是飞行类的实现。给会飞行的鸭子使用 * */public class FlyWithWings implements FlyBehavior{@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("我能飞");}}
package 策略模式;/** * 叫声类实现 * */public class Quack implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("呱呱叫");}}
package 策略模式;/** * 叫声类实现 * */public class Squeak implements QuackBehavior{@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("吱吱叫");}}
package 策略模式;/** * 叫声类实现 * */public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("不会叫");}}
package 策略模式;/** * 绿头鸭 * * * */public class MallardDuck extends Duck{/** * 绿头鸭使用Quack类处理呱呱叫,所以当performQuack()被调用时,叫的职责委托给Quack对象,而我们将得到真正的呱呱叫。 * */public MallardDuck() {quackBehavior = new Quack();flyBehavior = new FlyWithWings(); }@Overridepublic void dispaly() {// TODO Auto-generated method stubSystem.out.println("MallardDuck");}}
package 策略模式;/** * 模型鸭 * */public class ModelDuck extends Duck {public ModelDuck() {// TODO Auto-generated constructor stubflyBehavior = new FlyNoWay();quackBehavior = new Squeak();}@Overridepublic void dispaly() {// TODO Auto-generated method stubSystem.out.println("我是模型鸭");}}
package 策略模式;public class MiniDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();/** * 这会调用MallardDuck()继承来的方法,进而委托给给对象的QuackBehavior和FlyBehavior对象处理 * */mallard.performQuack(); mallard.performFly();System.out.println("------------------------");/** * 模型鸭 * */Duck model = new ModelDuck();model.performQuack();model.performFly();/** * 设置不同的飞行方式 * */model.setFlyBehavior(new FlyRocketProwered());model.performFly();}}
0 1
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式——策略设计模式
- Java设计模式—策略
- 设计模式——策略模式
- 设计模式——策略模式
- 每日设计模式——策略模式
- 设计模式——策略、代理模式
- svn详细说明
- NC portal获取当前登录者vo数据
- Android 颜色
- storyboard的连线
- iOS中数据请求
- 设计模式——策略模式
- 安装VC++ 2015 redistributable遇到的错误
- 3 linux下jni的使用
- Swift
- MySQL复制表结构 表数据
- 路径问题:相对路径与绝对路径详解
- Android的问号?和@符号的用法
- Leetcode 378. Kth Smallest Element in a Sorted Matrix
- 有序单链表的插入