先从一个简单案例开始:
某公司开发了一个模拟鸭子程序,这个游戏可以展示很多种鸭子的游泳方式和呷呷叫声。系统最初的设计者们使用了标准的面向对象技术,他们创建了一个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原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...
这种游戏模式强调的是孩子在玩中学,通过实际操作和互动来促进深度学习。深度学习是指幼儿在游戏过程中,不仅掌握知识,还能发展解决问题、创新思考和社交技能。 在【沙水构建游戏】中,教师可以设计各种主题,如...
【标题】:“11-04浅谈中学音乐艺术审美观的提升——以M中学为例” 这个标题揭示了文档的核心内容,它是一个关于中学音乐艺术审美教育的研究案例,特别是以M中学为研究对象。中学阶段是青少年成长的关键时期,音乐...
教学设计,作为教育规划的过程,旨在分析教学目标、选择教学内容、优化教学过程,并通过评价反馈不断调整教学策略。信息化教学设计在此基础上,利用信息技术和资源,以学生为中心,促进自主探究学习,提升信息素养。...
在自动化类专业的教育中,"金字塔型"教学模式是一种被广泛应用的教学策略,旨在构建系统而扎实的知识体系。本文以“自动控制原理”这门基础课程为例,深入探讨这种教学模式的特点、实施方法以及其对学生成长的影响。...
浅谈信息技术与小学语文教学的有效融合[J]. 语文教学通讯·D刊(学术刊), 2017(01):56-57. 虽然以上讨论主要围绕语文教学,但其核心理念——信息技术与教学的融合,同样适用于中职数学教学。新课改背景下,教育...
总结来说,微农场是城市家庭智能种植系统的一种创新实践,它将服务设计、智能技术与商业模式融为一体,旨在提供一种全新的、用户友好的都市农业体验,满足人们对绿色生活方式的追求,同时也推动了智能系统在农业领域...
【C语言程序设计教学改革】 C语言是计算机科学领域中一种基础且至关重要的编程语言,因其灵活性和高效性而在全球范围内广泛应用。然而,对于学习者来说,C语言的学习过程通常充满了挑战,尤其是对于独立学院的学生,...
本文以“高职机械设计基础课程”为例,深入探讨了如何利用云课堂移动App来提升教学质量与学生参与度。云课堂App作为一种信息化教学手段,它能有效地改变传统教学模式,帮助学生在课前预习、课中互动和课后复习等多个...
【正文】 旅游企业的人力资源管理面临着一个独特的挑战:高频率的人力资源流动。这个问题不仅会导致企业失去宝贵的专业技能和经验,...这种管理模式不仅可以为旅游企业带来竞争优势,也为其他行业提供了可借鉴的经验。
1. **系统匹配优化**:合理匹配空调系统的各个部件,如选择高效能的压缩机、优化风机设计以减少能耗,同时确保良好的热交换效果。 2. **智能控制策略**:利用先进的控制算法,根据电池温度、环境温度和车辆运行状态...
骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退...
针对这些挑战,一种新的工程造价改革模式应运而生——招标人提供工程量清单,投标人自报单价。在这种模式下,招标人在编制招标文件时,按照统一的计算规则列出工程的各项工程量,如土石方、钢筋混凝土、砌体等,然后...