8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern
在POS系统中,有时需要实行价格优惠, 该如何处理?
对普通客户或新客户报全价
对老客户统一折扣5%
对大客户统一折扣10%
注:课件来自Head-First OOAD课程资料
1.1 假设背景
Joe是一个OO程序员,所在的公司正在开发一款仿真游戏软件 “SimUDuck”,他的任务是完成游戏的重要功能
Joe works at a company that produces a simulation game called SimUDuck. He is an OO Programmer and his duty is to implement
the necessary functionality for the game
游戏具备以下的需求规格说明
The game should have the following specifications:
存在多种不同类型的鸭子
A variety of different ducks should be integrated into the game
鸭子会游泳 The ducks should swim
鸭子会叫“quack、quack”The duck should quack
1.2 初步的设计:简单
A First Design for the Duck Simulator Game

All ducks quack() and swim(). The superclass takes care of the implementation 父类实施了共同的功能
The display()method is abstract since all the duck subtypes look different 因为不同的鸭子有不同的外形,子类覆盖
Each duck subtype is responsible for implementing its own display() behavior for how it looks on the screen
Lots of other types of ducks inherit from the Duck type
1.3 需要鸭子飞起来…

1.4 出了一点小问题:橡皮鸭子也飞起来了..

1.5 继承机制起作用了
1.6 再增加一只鸭子:诱导鸭
需要修改的函数总量 = 每增加一个特殊功能*2 * 每增加一类鸭子*2, 好辛苦啊!好容易出哦!
1.7 设计原则
软件行业“公理”
软件项目中,唯一不变的事情就是“变化”
解决方法
拥抱变化,让“变化”成为你的设计的一部分
标识变化点,把它们与系统其余部分隔离开来
比较:GRASP原则: Protected Variations 隔离变化
“SimUDucK”游戏的需求总在变化,刚才的方案有点问题!
解决方法
把变化的部分,封装起来
1.8 尝试利用接口的威力
方案:把fly()从父类Duck中剥离,放 到新定义的一个接口 Flyable, 每个希 望能够飞起来的鸭子就实现这个接口
1.9 Duck游戏哪些是会变化的?
Fly() 和 quack() 行为在变化,所以,为每一种行为创建新类
复习:面向对象设计原则
1、把变化的部分,封装起来
2、面向接口设计(编程),而不是面向实现设计(编程) Program to an interface,not to an implementation
8.6 GOF设计模式四: 策略模式… Strategy Pattern的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 设计模式原来如此-策略模式(Strategy Pattern)
策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...
- 【UE4 设计模式】策略模式 Strategy Pattern
概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- java操作git简单实现
记录瞬间 import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ListBranchCommand; import org.ecli ...
- archlinux中安装Oracle12c的过程中遇到的问题
INFO: : cannot find INFO: /usr/lib64/libpthread_nonshared.aINFO: INFO: genclntsh: Failed to link lib ...
- node多人聊天室搭建
1.采用websocket: 为什么不用ajax的http:在用HTTP发送消息时,必须用一个新的TCP/IP连接.打开和关闭连接需要时间.此 外,因为每次请求都要发送HTTP头,所以传输的数据量也比 ...
- Query a JSON array in SQL
sql 中存的json 为数组: [{"Level":1,"Memo":"新用户"},{"Level":2," ...
- 激光三角法点云重建分享——halcon 方法
如今视觉应用方面单纯依靠2D图像解决问题存在很多问题.稳定性差.定位不准确.还有配合机器人抓取方面只能抓高度一致的物品.其实在Halcon算法库有非常强大的三维算法.包括点云重建.激光三角法(2D相机 ...
- 【转】Windons+jenkins,构建java程序,提示C:\Windows\TEMP\jenkins5037773887088486383.bat Access is denied
坑1: !!!前提:已设置本机电脑的账号密码, 解决方法:搜索程序services.msc-- 找到Jenkins-- 右键“属性”--登录--此账户--输入本机的账号密码--保存-- 停止Jenki ...
- jdk5升级至jdk8框架版本选型
spring-framework-4.3.18.RELEASE 4.3.x+:JDK8 Spring JDK Version Range Spring Framework 5.1.x: JDK 8- ...
- django 后端反向生成url
导入模块 from django.core.urlresolvers import reverse reverse() reverse(viewname, urlconf=None, args=Non ...
- 微信不支持App下载的解决方案 微信跳转打开外部浏览器下载(苹果跳转商店下载)
在微信中,打开app下载链接,或者使用微信扫一扫app下载二维码,都是无法下载app的. 因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载.下面给分享下,找到的2种有效的解决方案. 方案:点击链 ...
- Thymeleaf的一些操作
1. js取值 <script th:inline="javascript"> var message = [[${message}]]; console.log(me ...