网站建设好了怎么进行推广,wordpress管理后台,石家庄有什么好玩的地方,深圳网站做优化哪家公司好【0】README0.1#xff09;本文部分文字描述转自 “head first 设计模式”#xff0c;旨在学习 设计模式入门#xff08;策略模式#xff09; 的基础知识#xff1b;0.2#xff09;本文章节4和5的source code#xff0c;参见 设计模式——策略模式源代码【1】看个荔枝本文部分文字描述转自 “head first 设计模式”旨在学习 设计模式入门策略模式 的基础知识0.2本文章节4和5的source code参见 设计模式——策略模式源代码【1】看个荔枝从模拟鸭子应用说起1.1我们让鸭子飞起来method1利用继承实现在Duck中加入 fly() 方法不过并不是所有的鸭子都会飞比如橡皮鸭子干货——继承所出现的问题 Attention利用继承来提供Duck的行为这会导致下列哪些缺点defects d1代码在多个子类中重复 d2运行时的行为不容易改变 d3很难知道所有鸭子的全部行为 d4改变会牵一发而动全身造成其他鸭子不想要的改变 method2利用接口实现这将导致一个问题虽然Flyable 和 Quackable 可以解决问题但是代码不能复用干货——接口实现所出现的问题 【2】设计原则2.1原则1找出应用中可能需要变化之处把它们独立出来不要和那些不需要变化的代码混在一起2.2原则2针对接口编程而不是针对实现编程2.3针对接口编程的真正意思是针对超类编程可以更明确地说成“变量的声明类型应该是超类型可以是一个抽象类或一个接口只要是具体实现此超类的子类都可以指定给这个变量”干货——针对接口编程【3】solution——如何实现鸭子的行为我们应该在鸭子类中包含设定行为的方法这样就可以在运行时动态地改变绿头鸭的行为。3.1我们有两个接口——FlyBehavior 和 QuackBehavior3.2对以上设计的分析AnalysisA1这样一来可以让飞行和呱呱叫quack的动作被其他对象复用因为这些行为与鸭子类无关了 A2而我们新增一些行为不会影响到既有的行为类也不会影响 使用这些行为的 具体类如鸭子类 【4】整合鸭子的行为4.1关键在于 鸭子现在会将飞行和呱呱叫的动作委托别人进行处理而不是使用定义在Duck类内的 呱呱叫和飞行方法4.2整合后的代码如下【5】动态设定行为5.1我们想通过在鸭子子类中通过“设定方法”来设定鸭子的行为而不是在鸭子的构造器内实例化step1在Duck类中加入两个新方法 setFlyBehavior 和 setQuackBehavior package com.designpattern.chapter0;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public void setFlyBehavior(FlyBehavior fb){flyBehavior fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior qb;}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println(i am swiming!);}} step2制造一个新的鸭子类型模型鸭ModelDuck.java package com.designpattern.chapter0;public class ModelDuck extends Duck{public ModelDuck(){quackBehavior new Quack();flyBehavior new FlyWithWings();}Overridepublic void display() {System.out.println(i am a model duck!);}
} step3建立一个新的 FlyBehavior 类型FlyRocketPowered.java package com.designpattern.chapter0;public class FlyRocketPowered implements FlyBehavior{Overridepublic void fly() {System.out.println(i am flying with rocket power!);}
} step4改变测试类加入模型鸭并使模型鸭具有火箭动力 package com.designpattern.chapter0;public class ModelDuckSimulator {public static void main(String[] args) {Duck mallard new MallardDuck();mallard.performQuack();mallard.performFly();Duck modelDuck new ModelDuck();modelDuck.performFly();modelDuck.setFlyBehavior(new FlyRocketPowered());modelDuck.performFly();}
} 5.2组合定义将两个类结合起来使用这就是组合。这种做法和继承不同的地方在于鸭子的行为不是继承来的而是和适当的行为对象组合来的5.3设计原则 多用组合少用继承【6】封装行为的大局观6.1下面是整个重新设计后的类结构你所期望的一切都有 鸭子继承Duck飞行行为实现 FlyBehavior接口呱呱叫行为实现 QuackBehavior接口6.2我们不再把鸭子的行为说成是 一组行为而是将其想象成“一族算法”6.3策略模式定义 策略模式定义了算法族分别封装起来让它们之间可以互相替换此模式让算法的变化独立于使用算法的客户干货——策略模式定义【7】策略模式总结 7.1OO原则(rules): r1封装变化 r2多用组合少用继承 r3针对接口编程不针对实现编程 7.2OO模式pattern 策略模式——策略模式定义了算法族分别封装起来让它们之间可以互相替换此模式让算法的变化独立于使用算法的客户