策略模式… 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的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  3. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  4. 设计模式原来如此-策略模式(Strategy Pattern)

    策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...

  5. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  6. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  7. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  8. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  9. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

随机推荐

  1. vue2.x入坑总结—回顾对比angularJS/React的一统

    从感性的角度讲,我是不屑于用VUE,觉得react套件用起来更顺手,但是vue现在越来火,所以也不得入vue(杂烩汤)的坑.vue/anguarJS/React,三者对关系现在就是: https:// ...

  2. extjs +String2 +Spring 下的分页 以及返回json格式错误的问题

    首先,分页  很简单. 1前台extjs数据源, var shipMgrStore = Ext.create('Ext.data.Store', { model: 'App.ShipMgr.model ...

  3. Android-Gradle(四)

    当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...

  4. Machine Learning 第三周

    ML week3 逻辑回归 Logistic Function h_\theta(x)=g(\theta^Tx) g(t)=\frac{1}{1+e^{-z}} 当t大于0, 即下面公式成立时,y=1 ...

  5. ubuntu上传到百度网盘

    1 2 亲测可以上传

  6. 2018-2019-2 20165335『网络对抗技术』Exp5:MSF基础应用

    主动攻击的实践: ms17_010(成功) 浏览器攻击的实践:ms14_064(成功) 客户端攻击的实践:adobe reader PDF的攻击(成功) 运用辅助模块的实践:VNC弱口令破解/绕过(失 ...

  7. CCF CSP 201503-1 图像旋转 (降维)

    题目链接:http://118.190.20.162/view.page?gpid=T27 问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0M ...

  8. Android界面跳转几种情况

    Android界面简单跳转, Intent intent =new Intent(MainActivity.this,SecondActivity.class); startActivity(inte ...

  9. 使用synchronized同步,经典银行账户问题

    1.新建Account类,使用synchronized同步增加和减少金额方法. package com.xkzhangsan.synchronizedpack.bank; public class A ...

  10. mysql 数据库的设计三范式

    三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物 ...