8.6 GOF设计模式四: 策略模式… Strategy Pattern

时间:2022-11-18 22:41:39

策略模式… 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

  8.6 GOF设计模式四: 策略模式… Strategy Pattern

  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 需要鸭子飞起来…
  8.6 GOF设计模式四: 策略模式… Strategy Pattern


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

8.6 GOF设计模式四: 策略模式… Strategy Pattern


1.5 继承机制起作用了
8.6 GOF设计模式四: 策略模式… Strategy Pattern


1.6 再增加一只鸭子:诱导鸭
8.6 GOF设计模式四: 策略模式… Strategy Pattern

  需要修改的函数总量 = 每增加一个特殊功能*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. SharePoint 2013 工作流设计之Designer 使用“可视化视图”

    SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是类似Visio的设计视图(需要Visio 2013支持),下面我们简单介绍下,在可视化视图下,使用工 ...

  2. css3过渡transition

    过渡:transition transition:transition-property/duration/timing-function/delay的缩写. transition : <'tr ...

  3. jQuery Attributes vs&period; Properties

    Attributes vs. Properties attributes和properties之间的差异在特定情况下是很重要.jQuery 1.6之前 ,.attr()方法在取某些 attribute ...

  4. wcf系列学习5天速成——第三天 分布性事务的使用 有时间再验证下 不同库的操作

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2011/11/06/2238273.html 今天是速成的第三天,再分享一下WCF中比较常用的一种 ...

  5. scheme代码高亮

    (defun iedit-symbol-in-defun () "Enter `iedit-mode' to rename the symbol in current function, o ...

  6. Android开发之手把手教你写ButterKnife框架(一)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52662376 本文出自:[余志强的博客] 一.概述 JakeWhar ...

  7. &lbrack;转&rsqb;&lbrack;html&rsqb;设置IIS 默认页

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...

  8. Java8 list根据对象某个属性去重

    1. 添加方法: import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import j ...

  9. print、print&lowbar;r、echo到底有什么区别?

    echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在 ...

  10. 线段树&amp&semi;&amp&semi;线段树的创建线段树的查询&amp&semi;&amp&semi;单节点更新&amp&semi;&amp&semi;区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...