作业二:软件设计原则、设计模式
| 这个作业属于哪个课程 | 2022软件代码开发技术 |
|---|---|
| 这个作业要求在哪里 | 读书笔记----软件设计原则、设计模式 |
| 这个作业的目标 | 这次的作业目标是选择一本有关于设计模式的书阅读,加强对软件设计原则、设计模式概念的认识,并且根据以往代码开发的经历加深对其理解。 |
书籍详情
《软件秘笈:设计模式那点事》 ——郑阿奇
《软件秘笈:设计模式那点事》在第1章软件设计模式概述后,从第2章到第24章诠释23个软件设计模式。
每一章都以一个生活故事开始,然后是模式定义、模式分析、模式实现、设计原则和使用场合。模式实现通过Eclipse中的Java工程展开,采用软件编程诠释设计模式故事中的情节和操作,非常有趣。在这个基础上,总结该软件设计模式的设计原则,最后提出使用场合。
第25章对各种软件设计模式进行系统总结,第26章是各种软件设计模式综合应用。
设计模式概述
设计模式( Design Pattern ) 就是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。
使用设计模式的目的是为了提高代码的可重用性,让代码更容易被他人理解,使系统质量更加有保证、系统更加可靠。
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;
结构型模式用来处理类或者对象的组合;
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
设计模式实例探索
由于全书篇幅过长,不对每个设计模式实例一一介绍。
在这里我将简单介绍结构型模式中的 “装饰者模式(Decorator Pattern)”。
书中采用染色馒头事件进行该模式的讲述。下图为黑心商家制作染色馒头的过程。
而染色馒头的制作过程:
(1) 需要生产一个正常馒头;、
(2) 为了节省成本(不使用玉米面),使用染色剂加入到正常馒头中;
(3) 通过和面机搅拌,最后生产出“玉米馒头”。
一般的逻辑思维是如何实现上述过程的呢?我们来这样设计: 定义一个生产馒头的接口,正常馒头实现该接口,而染色馒头继承正常馒头类口,不同的是染色馒头在具体实现的时候,增加了个性的行为(添加染色剂)。正常馒头实现了馒头接口中准备材料、和面和蒸馒头三个方法,然后通过一个加工馒头的方法调用来生产正常馒头。染色馒头继承了正常馒头,不同的是在染色馒头中增添了个性行为一添加染色剂。然后,重载父类中的和面方法,先添加染色剂后和面。这样, 一个染色馒头就生产出来了。
下为一般逻辑下生产染色馒头的逻辑结构图
染色慢头的装饰者模式实现
装饰者模式( Decorator Pattern) ,是在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
使用装饰者模式的时候需要注意以下几点内容:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用。
(3) 装饰对象接受所有来自客户端的请求,并把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。然而,装饰者模式不需要子类,可以在应用程序运行时动态扩展功能,更加方便、灵活。
装饰者模式是在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。为了装饰正常馈头NormalBread, 我们需要一个和正常馈头一样的抽象装饰者:AbstractBread, 该类和正常馈头Norma!Bread 一样实现!Bread 馈头接口。不同的是,该抽象类含有一个IBread 接口类型的私有属性bread, 然后通过构造方法,将外部IBread接口类型对象传入。在AbstractBread 抽象类中,调用bread 对象实现IBread 接口的各个方法。
设计原则
- 封装变化部分
我们做软件设计最大的敌人就是应对不断变化的需求,变化是无穷无尽的,项目的反复修改,让我们精疲力尽。设计模式是封装变化的最好阐释,无论哪一种设计模式针对的都是软件系统中存在“变化”的部分,然后使用抽象对这些“变化”的部分进行封装。使用抽象的好处就在千为软件的扩展提供了很大的方便性。在装饰者模式中合理地利用了类继承和组合的方式,非常灵活地表达了对象之间的依赖关系。装饰者模式应用中“变化”的部分是组件的扩展功能,装饰者和被装饰者完全隔离开来,这样我们就可以任意地改变装饰者和被装饰者,而不会产生任何影响。 - “开- 闭“原则
对扩展开放,对修改关闭——“开-闭“原则在装饰者模式中体现得非常明显。我们在需要对组件进行扩展、增添新的功能行为的时候,只需要实现一个特定的装饰者即可,这完全是增量修改,对原有的软件功能结构没有任何影响,对客户端应用程序来说也完全是透明的,不必关心内部的实现细节,只要能动态地扩展,实现我们需要的功能即可。 - 面向抽象编程,不要面向实现编程
我们一直在强调“面向抽象编程,不要面向实现编程”,需要注意的是这里的抽象并不是指具体的抽象类,而是指具有抽象行为的接口或者抽象类。在装饰者模式中,装饰者角色就是抽象类实现,面向抽象编程的好处就在千起到了很好的接口隔离作用。在运行时,我们具体操作的也是抽象类型引用,这些都显示了面向抽象编程。 - 优先使用对象组合,而非类继承
装饰者模式最成功的地方就是合理地使用了对象组合方式,通过组合灵活地扩展了组件的功能,所有的扩展功能都是通过组合而非继承获得的,这从根本上决定了这种实现是高内聚、低耦合的。在前面,我们已经提到过,类继承是强关联关系,对象组合则是弱关联关系,降低软件功能之间耦合度最好也是最有效的方式就是使用对象组合的方式代替类继承。
心得体会
装饰者模式,顾名思义就是对原有的对象,不加以改变地进行拓展,类似于Java中多态的特点一样,同时也有继承的属性。装饰者模式的设计原则就很好地揭示了Java设计的原则,我对这一方面印象深刻,是因为在这之前我一直使用Java进行开发,对Java的特点有不少自己的心得体会。
另外其实还有许多其它模式,也是我在平时项目开发中经常接触到的,希望在接下来的课程中多多学习,加深对模式原则的理解,使自己早日进阶代码水平,成为一个更全面的程序员。
截图


浙公网安备 33010602011771号