先从一个简单案例开始:
某公司开发了一个模拟鸭子程序,这个游戏可以展示很多种鸭子的游泳方式和呷呷叫声。系统最初的设计者们使用了标准的面向对象技术,他们创建了一个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
分享到:
相关推荐
本文以项目中的一个工作流模块,演示责任链模式、策略模式、命令模式的组合实现!最近在做的一个项目,涉及到的是一个流程性质的需求。关于工程机械行业的服务流程:服务任务流程和备件发运流程。项目之初,需求不是...
数据仓库和数据湖是两种不同数据管理策略的代表,它们反映了数据架构的演进历程。数据仓库自20世纪70年代随着关系数据库的发展而兴起,主要目标是为决策支持提供结构化的、一致的和历史的数据。数据仓库通过ETL...
基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...
在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...
教师可以通过设计多种教学活动,使学生在参与中学习。在教授三角形相关知识时,教师可以引导学生利用塑料棒亲自构建三角形模型,通过动手操作亲身体验和验证“两边之和大于第三边”的数学定理。这样的活动不仅能激发...
贾志豪在其演讲稿《组合游戏略述——浅谈SG游戏的若干拓展及变形》中,深入探讨了组合游戏的多种形态,特别强调了Every-SG游戏与Cutting Edges游戏的规则及其策略性。 Every-SG游戏是一种特殊的组合游戏,其特色...
【标题】:“11-04浅谈中学音乐艺术审美观的提升——以M中学为例” 这个标题揭示了文档的核心内容,它是一个关于中学音乐艺术审美教育的研究案例,特别是以M中学为研究对象。中学阶段是青少年成长的关键时期,音乐...
因此,【微农场】——一种城市家庭智能种植系统的创新设计与研究,应运而生。 【微农场】系统基于现代科技,特别是人工智能和物联网技术,不仅能够帮助城市家庭轻松种植蔬菜,还能对植物的生长情况进行智能化监控和...
在自动化类专业的教育中,"金字塔型"教学模式是一种被广泛应用的教学策略,旨在构建系统而扎实的知识体系。本文以“自动控制原理”这门基础课程为例,深入探讨这种教学模式的特点、实施方法以及其对学生成长的影响。...
浅谈信息技术与小学语文教学的有效融合[J]. 语文教学通讯·D刊(学术刊), 2017(01):56-57. 虽然以上讨论主要围绕语文教学,但其核心理念——信息技术与教学的融合,同样适用于中职数学教学。新课改背景下,教育...
【C语言程序设计教学改革】 C语言是计算机科学领域中一种基础且至关重要的编程语言,因其灵活性和高效性而在全球范围内广泛应用。然而,对于学习者来说,C语言的学习过程通常充满了挑战,尤其是对于独立学院的学生,...
本文以“高职机械设计基础课程”为例,深入探讨了如何利用云课堂移动App来提升教学质量与学生参与度。云课堂App作为一种信息化教学手段,它能有效地改变传统教学模式,帮助学生在课前预习、课中互动和课后复习等多个...
【正文】 旅游企业的人力资源管理面临着一个独特的挑战:高频率的人力资源流动。这个问题不仅会导致企业失去宝贵的专业技能和经验,...这种管理模式不仅可以为旅游企业带来竞争优势,也为其他行业提供了可借鉴的经验。
通过紫砂邮票墙和“梁祝化蝶”墙的设计,幼儿园将传统文化艺术元素与孩子们的日常生活结合起来,使得每一个角落都能成为孩子们感知、体验和学习的场所。在这样的环境中成长的孩子们,能够在潜移默化中接受文化的熏陶...
1. **系统匹配优化**:合理匹配空调系统的各个部件,如选择高效能的压缩机、优化风机设计以减少能耗,同时确保良好的热交换效果。 2. **智能控制策略**:利用先进的控制算法,根据电池温度、环境温度和车辆运行状态...
骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退...