【0】README
0.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 和 QuackBehavior;
3.2)对以上设计的分析(Analysis):
A1)这样一来,可以让飞行和呱呱叫(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.1)OO原则(rules):
r1)封装变化;
r2)多用组合,少用继承;
r3)针对接口编程,不针对实现编程;
7.2)OO模式(pattern):
策略模式——策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户;

设计模式入门(策略模式)相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. 测试用例设计方法-错误推测法
  2. 51nod 1201:整数划分 超级好的DP题目
  3. Linux系统无线鼠标不能用,手把手教你win7系统无线鼠标不能用的处理方案
  4. 联科集团携手阿里云发布科研混合云平台 共建科研教育新生态
  5. java开发书籍,送大厂面经一份!
  6. uva 10539——Almost Prime Numbers
  7. uni-app第三方登陆-微信
  8. 第二个冲刺期的第六天
  9. 算法:工作窃取算法(work-stealing)。
  10. 【相机标定与三维重建原理及实现】学习笔记2——标定的算法与方法
  11. ARM指令集【 PUSH \POP】【跳转B\BL\BX\BLX \BXJ】【数据操作LDR\LDRB\LDRH\LDM\STR\STRB\STRH\STM】【移位LSL/LSR/ASL/ASR】
  12. Linux安装RPM、YUM
  13. 印象笔记 HTML邮件,#印象笔记#如何使用私有邮箱地址保存内容到印象笔记?
  14. Android 12 Watchdog(4) Trace生成过程
  15. 图文对齐居中的几种方式
  16. 计算机最主要的硬盘,电脑硬盘应该分几个区比较合适?
  17. 学习笔记之Markdown(一)
  18. 机器自动翻译古文拼音 - 将进酒拼音版本,译文拼音版本
  19. 内皮细胞生长添加剂(ECGF/ECGS)丨艾美捷解决方案
  20. stm32 HAL库分析之CAN

热门文章

  1. [APIO2018] New Home 新家(线段树,二分答案,离散化)
  2. 【每日一题】8月10日题目精讲—排座椅
  3. [TJOI2011] 书架(线段数优化dp + 单调栈)
  4. UOJ#84-[UR #7]水题走四方【dp】
  5. CF662C-Binary Table【FWT】
  6. hdu4336-Card Collector【min-max容斥,期望概率】
  7. ABC182——F - Valid payments Editorial
  8. Codeforces Round #673 (Div. 2)——待补 E
  9. 【记忆化搜索】【线性化DP】滑雪 (ssl 1202/luogu 1434/pku 1088)
  10. Codeforces Round #485 (Div. 2)