`
qiemengdao
  • 浏览: 272923 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

设计模式浅谈1——策略模式

阅读更多
先从一个简单案例开始:
    某公司开发了一个模拟鸭子程序,这个游戏可以展示很多种鸭子的游泳方式和呷呷叫声。系统最初的设计者们使用了标准的面向对象技术,他们创建了一个Duck基类供所有其它类型的鸭子继承。

为了提高竞争力,我们现在需要鸭子可以飞。
想法一:仅仅只需要在Duck类里增加fly()方法,然后所有其他鸭子就都可以继承它了。

   但是这没有注意到并不是所有Duck的子类都需要fly()方法。当给Duck基类增加新行为的时候,同时给那些不需要这些行为的Duck的子类增加了。
   局部的代码更新导致了非局部的效果(会飞的橡皮鸭子)!


想法二:利用接口。
把fly()从Duck基类里拿出来,然后创建一个有fly()方法的Flyable()接口。这样,只有那些需要飞的鸭子才会通过实现这个接口来获得fly()方法…并且,最好再创建一个Quackable接口,因为并不是所有的鸭子都会呷呷叫。

我们知道并不是所有的子类都有飞行和呷呷叫的行为,所以继承不是正确的方法。但是,尽管让子类实现Flyable或者Quackable解决了部分问题(不会再有会飞的橡皮鸭子),但是这种方法彻底破坏了行为的重用,所以它只是制造了另一个维护上的噩梦。当然,鸭子可能有一种以上的飞行行为…

设计原则一: 识别你的应用程序里变化的部分,并且把它们与不变的部分隔离开。
    从另一个角度考虑这个原则:找到变化并且封装起来,稍后你就可以在不影响其他部分的情况下修改或扩展封装的变化部分。
     尽管概念很简单,但是它几乎是所有设计模式的基础。所有模式都提供了使系统里变化的部分独立于其它部分的方法。
     好的,是把鸭子的行为从Duck类里拖出来的时候了!拿走变化部分并封装它,所以它将不会影响你的代码。这样做的结果则是:使你的系统只会因代码改变带来的少许影响而有更大的灵活性。
分开变化和不变的部分
    我们从那里开始?在我们知道的范围内,除了fly()和quack()的问题,Duck类工作的很好,它没有其他表现出要变化或频繁改变的地方。所以,除了一些微小的改变,我们很恰当的留下Duck类自己。
    现在,从那些保持不变的部分分离出变化的部分,我们将创建两组类(完全从Duck分离出来),一组给飞行,一组给呷呷叫。每组类都将拥有它们各自行为的实现。例如,我们可能有一个实现呷呷叫的类,另一个实现吱吱叫的类,还有一个实现保持沉默的类。
    我们知道fly()和quack()都是Duck类在鸭子里不断变化的部分。通过从Duck类分离出这些行为,我们将把两个方法都从Duck类里拖出来并且创建一组新的类来表示每个行为。


设计原则二: 面向接口而不是面向实现编程。
   我们将使用一个接口来表示每个行为 – 例如,FlyBehavior和QuackBehavior –每个行为的的执行者都将实现其中一个接口。
   在我们的新设计里,Duck基类将使用一个接口(FlyBehavior和QuackBehavior)来表示行为,所以行为(换句话说,具体行为是编写在实现了FlyBehavior接口和QuackBehavior接口的类里)的实际实现者将不再受制于Duck基类。
   从现在开始,Duck类的行为将实现在一个单独了类里 - 一个实现了特殊行为接口的类。
另一个方面,Duck类不再需要知道太多关于它们自己实现的细节。


从而只要在Duck类中持有接口的引用,并在初始化Duck子类的时候确定具体的实现FlyBehavior的子类就可以了。具体代码见附件。
 


    
  • 大小: 111.1 KB
  • 大小: 101.2 KB
  • 大小: 106.3 KB
  • 大小: 93.9 KB
  • 大小: 95.2 KB
  • 大小: 93.9 KB
  • 大小: 72.8 KB
分享到:
评论

相关推荐

    Java设计模式 版本2

    对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...

    浅谈简单工作流设计——责任链模式配合策略与命令模式的实现

    本文以项目中的一个工作流模块,演示责任链模式、策略模式、命令模式的组合实现!最近在做的一个项目,涉及到的是一个流程性质的需求。关于工程机械行业的服务流程:服务任务流程和备件发运流程。项目之初,需求不是...

    design-pattern-java.pdf

    基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...

    浅谈数据库设计.doc

    浅谈数据库设计 在当今的信息时代,信息已逐渐成为决定生产力、竞争力和经济效益的重要资源,管 理者只有及时、准确地掌握相关信息,才能做出正确的决策。数据库技术是指对于一个 给定的应用环境,构造最优的数据库...

    IOI国家集训队论文集1999-2019

    骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

    Think in ActionScript 3.0Ⅰ Ⅱ Ⅲ汇总

    7.浅谈设计模式 8.面向对象程序设计 8.1 类和对象的概念 8.2 类之间的关系 8.3 面向对象程序设计(OOP) 8.4 出圈游戏 —— 面向过程 VS 面向对象 8.4.1 游戏规则 8.4.2 出圈游戏 —— 面向过程(cirgame/ Circle...

    acm国家集训队2000年论文合集

    acm大学生程序设计竞赛,国家集训队2000年论文合集 国家集训队2000论文集 陈彧:《信息学竞赛中的思维方法》 方奇:《动态规划》 高寒蕊:《递推关系的建立及在...张一飞:《冗繁削尽留清瘦——浅谈信息的充分利用》

    数据挖掘论文合集-242篇(part1)

    数据仓库与数据挖掘技术浅谈.caj 数据仓库和数据挖掘技术在ERP中的应用.kdh 数据仓库的建设与数据挖掘技术浅析.caj 数据仓库的建设与数据挖掘技术浅析1.caj 数据挖掘 企业决策分析的有效工具.caj 数据挖掘——技术与...

    数据挖掘论文合集-242篇(part2)

    数据仓库与数据挖掘技术浅谈.caj 数据仓库和数据挖掘技术在ERP中的应用.kdh 数据仓库的建设与数据挖掘技术浅析.caj 数据仓库的建设与数据挖掘技术浅析1.caj 数据挖掘 企业决策分析的有效工具.caj 数据挖掘——技术与...

    数据挖掘论文合集-242篇(part3)

    数据仓库与数据挖掘技术浅谈.caj 数据仓库和数据挖掘技术在ERP中的应用.kdh 数据仓库的建设与数据挖掘技术浅析.caj 数据仓库的建设与数据挖掘技术浅析1.caj 数据挖掘 企业决策分析的有效工具.caj 数据挖掘——技术与...

    数据挖掘在各行业的应用论文

    数据仓库与数据挖掘技术浅谈.caj 用户访问模式数据挖掘的模型与算法研究.caj 数据仓库的建设与数据挖掘技术浅析.caj 分类特征规则的数据挖掘技术.caj 数据挖掘技术的主要方法及其发展方向.caj OLAP和数据挖掘技术在...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    6.1 浅谈代码优化 138 6.2 并不仅仅是汇编 139 6.2.1 在算法实现时减少上下文的依赖关系 139 6.2.2 低效的静态变量 140 6.2.3 数据的组织 141 6.2.4 消除除法 142 6.2.5 避免过大的循环 144 6.3 汇编和C/C++的混合...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    6.1 浅谈代码优化 138 6.2 并不仅仅是汇编 139 6.2.1 在算法实现时减少上下文的依赖关系 139 6.2.2 低效的静态变量 140 6.2.3 数据的组织 141 6.2.4 消除除法 142 6.2.5 避免过大的循环 144 6.3 汇编和C/C++的混合...

Global site tag (gtag.js) - Google Analytics