实验二观察者模式与装饰模式
- 格式:docx
- 大小:100.87 KB
- 文档页数:8
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够得到通知并自动更新。
观察者模式包含以下几个主要特点:1. 主题(Subject)和观察者(Observer):- 观察者模式包含两个主要角色,即主题和观察者。
主题是被观察的对象,它维护了一组观察者,并提供了添加、删除和通知观察者的方法。
观察者则是依赖于主题的对象,当主题状态发生改变时,观察者得到通知并进行相应的更新。
2. 松散耦合:- 观察者模式实现了松散耦合,使得主题和观察者之间的关系不是静态的硬编码关系,而是动态的。
主题无需知道观察者的具体类,只需知道它们实现了共同的接口。
3. 支持广播通信:- 主题状态发生改变时,会向所有注册的观察者发送通知,实现了一对多的通信机制。
这样,可以方便地广播信息给所有关注主题状态变化的观察者。
4. 观察者可以动态加入和退出:- 在运行时,可以动态地添加新的观察者或删除不再关心主题状态的观察者,而不需要修改主题的代码。
这使得系统更加灵活。
5. 遵循开闭原则:- 观察者模式遵循开闭原则,即对扩展开放,对修改关闭。
通过添加新的观察者,而不是修改现有的代码,可以轻松地扩展系统功能。
6. 注意观察者的通知顺序:- 观察者收到通知的顺序可能是随机的,具体取决于主题的实现。
如果观察者之间有依赖关系,需要注意通知的顺序可能对系统产生影响。
7. 可能导致性能问题:- 如果观察者的数量较多或者通知过于频繁,可能导致性能问题。
在实现时需要注意考虑性能优化。
观察者模式常用于实现分布式事件处理系统、GUI系统中的事件处理等场景,它提供了一种松散耦合的设计,使得对象之间的关系更加灵活和可扩展。
实验报告课程名称java设计模式实验项目观察者模式与装饰模式的应用实验仪器 PC个人终端系别计算机学院专业软件工程班级/学号软工1302/2013011342 学生姓名阮翀实验日期 2015-10-12 成绩指导教师张志华实验二观察者模式与装饰模式的应用一、实验目的通过该实验,理解观察者模式和装饰模式的意图、结构,在软件开发中使用这些模式并进行功能验证。
二、实验内容1.猫、狗与老鼠。
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
2.我跟妈妈说:“妈妈,我和妹妹在院子里玩。
饭做好了叫我们一声。
”请用观察者模式设计一个模拟系统。
3.采用装饰模式为图书馆中的项目(书或音像盘)增加“可借”功能。
使用Java语言设计一个模拟系统。
4.自定义JButton。
开发人员设计用户接口时,通常需要更多有特色的控件,Decorator模式就提供了一个方法去创造或修改现有的UI控件。
使用装饰模式实现一个带有对角线的按钮。
三、实验步骤与要求1.对于以上题目要认真分析和理解题意,在观察者模式和装饰模式题目中各选1个进行编程,程序中要求使用相应的模式。
2.上机录入,使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,此时可以采用观察者模式。
观察者模式意图:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
”观察者模式的UML类图:装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。
装饰模式意图:“动态地给对象添加一些额外的职责。
就功能来说装饰模式相比生成子类更为灵活。
”装饰模式的UML类图:五、上机报告内容1、班级、学号、姓名、实验完成日期;2、实验题目;3、设计方案:给出你的设计方案,包括结构类图及相关说明;4、源代码:设计方案中各个类和接口的源代码,包括测试主类的源代码.5、测试数据及运行结果6、总结:1)运用设计模式总结:对所运用的设计模式的名称,分类,意图,结构,角色作用的总结,所运用的面向对象设计原则。
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
实验报告课程名称java设计模式实验项目观察者模式与装饰模式的应用实验仪器 PC个人终端系别计算机学院专业软件工程班级/学号软工1302/2013011342学生姓名阮翀实验日期 2015-10-12成绩指导教师张志华实验二观察者模式与装饰模式的应用一、实验目的通过该实验.理解观察者模式和装饰模式的意图、结构.在软件开发中使用这些模式并进行功能验证。
二、实验内容1.猫、狗与老鼠。
假设猫是老鼠和狗的观察目标.老鼠和狗是观察者.猫叫老鼠跑.狗也跟着叫.使用观察者模式描述该过程。
2.我跟妈妈说:“妈妈.我和妹妹在院子里玩。
饭做好了叫我们一声。
”请用观察者模式设计一个模拟系统。
3.采用装饰模式为图书馆中的项目(书或音像盘)增加“可借”功能。
使用Java语言设计一个模拟系统。
4.自定义JButton。
开发人员设计用户接口时.通常需要更多有特色的控件.Decorator模式就提供了一个方法去创造或修改现有的UI控件。
使用装饰模式实现一个带有对角线的按钮。
三、实验步骤与要求1.对于以上题目要认真分析和理解题意.在观察者模式和装饰模式题目中各选1个进行编程.程序中要求使用相应的模式。
2.上机录入.使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:在许多设计中.经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣.而且这多个对象都希望跟踪那个特殊对象中的数据变化.此时可以采用观察者模式。
观察者模式意图:“定义对象间的一种一对多的依赖关系.当一个对象的状态发生变化时.所有依赖于它的对象都得到通知并被自动更新。
”观察者模式的UML类图:装饰模式是动态地扩展一个对象的功能.而不需要改变原始类代码的一种成熟模式。
装饰模式意图:“动态地给对象添加一些额外的职责。
就功能来说装饰模式相比生成子类更为灵活。
”装饰模式的UML类图:五、上机报告内容1、班级、学号、姓名、实验完成日期;2、实验题目;3、设计方案:给出你的设计方案.包括结构类图及相关说明;4、源代码:设计方案中各个类和接口的源代码,包括测试主类的源代码.5、测试数据及运行结果6、总结:1)运用设计模式总结:对所运用的设计模式的名称,分类,意图,结构,角色作用的总结.所运用的面向对象设计原则。
设计模式之装饰模式实验报告第七组一、实验目的用java实现一个装饰模式,加深对装饰模式的理解。
二、实验内容在一个学校中,教师类ITeacher()具有教书方法teach()。
现需要动态给对象CTeacher ()添加J2EETeacher()方法。
使用装饰模式设计该系统,绘制类图并编程实现。
三、实验步骤实验步骤:(算法描述、源程序、操作步骤和方法)第一步:进入实验系统,创建Java 项目;第二步:按照实验指导书的内容,创建需要的各个类;第三步;编写每一个类的代码;第四步:对自己创建的Java项目进行调试;Java代码:ITeacher,javapackage ;public interface ITeacher {public void teach();}ITeacher.javapackage ;public class CTeacher implements ITeacher {ITeacher teacher;public CTeacher(){}public CTeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教C++");//this.teacher.teach();}}J2EETeacher.javapackage ;public class J2EETeacher implements ITeacher { ITeacher teacher;public J2EETeacher(){}public J2EETeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教J2EE");this.teacher.teach();}}Client.javapackage ;public class Client {public static void main(String[] args) { CTeacher c = new CTeacher();J2EETeacher cj = new J2EETeacher(c);cj.teach();}}四、运行结果五、类图。
软件设计中的装饰者模式与观察者模式现如今,软件开发和设计已经成为了一个热门话题。
众多小型和大型公司都在寻找成熟的软件方法和设计模式,以保证他们的软件产品具有功能完备性,同时可维护性和扩展性。
而软件设计模式是很多软件工程师都要掌握的知识点之一。
在软件设计中,装饰者模式和观察者模式两种设计模式经常被使用。
这两种模式有助于简化程序设计流程,并提升程序的可维护性。
本文将分别详细讲解这两种设计模式在软件工程中的应用。
装饰者模式装饰者模式是一种对象结构型设计模式。
它通过将对象进行动态的添加功能和修改行为,实现代码的可扩展性和可维护性。
具体而言,装饰者模式利用一种叫做“装饰”的方式来为一个对象动态地添加新的功能和行为,而不需要修改对象的原有代码。
并且,将装饰功能从被装饰的对象中分离出来,从而保持代码的开闭原则,即对修改关闭,对扩展开放。
在实际应用中,装饰者模式常常用于需要增加一些特有的功能但并不适合使用继承方式进行实现的情况下。
例如,一种饮料店提供了各种基础饮料,例如咖啡和茶。
为了满足客户的需求,饮料店也提供了多种口味的调料,包括巧克力、焦糖和奶油等等。
如果采用继承方式进行设计,就需要对每一种饮料和调料进行派生,而且难以针对每一种饮料和调料的特征进行管理。
而利用装饰者模式,在基础饮料中添加调料时,只需要用装饰者包装一下即可,简单而且易于管理。
观察者模式观察者模式是一种行为型设计模式,它定义了一种一对多的关系,让多个对象都能同时接受到某个对象的状态变化。
当被观察对象的状态发生变化时,会自动通知它的所有观察者。
观察者模式主要由被观察者(Subject)和观察者(Observer)组成。
在实际应用中,观察者模式被广泛应用于GUI类的设计和实现中。
例如,在一个界面中,用户对界面的某个按钮进行点击时,可能需要对几个组件进行状态的同步更新。
这时候,可以采用观察者模式,将按钮作为subject,所有需要更新状态的组件作为observer,并将他们组成一对多的关系。
软件工程中的软件设计模式实例解析与应用软件设计模式是软件工程中非常重要的概念之一,它提供了一种在特定情境下解决问题的方案,并且经过多年的实践和总结,各种经典的设计模式已经被广泛应用于软件开发过程中。
本文将对几种常见的软件设计模式进行实例解析,并探讨它们在实际开发中的应用。
一、单例模式单例模式是一种创建型设计模式,它确保一个类只有一个实例,并且提供一个全局访问点。
在许多场景下,只需要一个对象来协调系统的操作,这时候就可以使用单例模式。
例如,在一个多线程的环境中,需要确保只有一个数据库连接实例。
此时,可以使用单例模式来创建一个唯一的数据库连接对象,所有线程都可以通过该对象进行数据库操作。
二、工厂模式工厂模式是一种创建型设计模式,它通过提供一个创建对象的接口来解耦对象的创建和使用。
在工厂模式中,客户端使用工厂接口创建对象,而不是直接使用 new 操作符来实例化对象。
例如,一个图形绘制软件需要绘制多种图形,包括圆形、矩形和三角形。
可以使用工厂模式来创建不同类型的图形对象,客户端只需要通过调用工厂接口的方法来创建所需的图形对象,从而实现了图形的创建和使用的解耦。
三、观察者模式观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当目标对象发生变化时,会自动通知所有观察者对象。
例如,在一个电商平台中,当用户下单购买商品时,需要同时通知库存管理系统和物流系统进行相应的处理。
可以使用观察者模式来实现,库存管理系统和物流系统作为观察者对象,监听用户下单事件,当事件发生时,系统会自动通知观察者对象进行处理。
四、适配器模式适配器模式是一种结构型设计模式,它将一个类的接口转换成客户端所期待的另一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
例如,一个音频播放器只支持 MP3 格式的音频文件,而现在需要支持其他格式的音频文件。
可以使用适配器模式来创建一个适配器,将其他格式的音频文件转换为 MP3 格式,从而实现音频播放器对各种格式音频的兼容。
Observer(观察者模式)Observer(观察者模式)属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
拿项目的 npm 依赖举例子:npm 包与项目是一对多的关系(一个 npm 包被多个项目使用),当 npm 包发布新版本时,如果所有依赖于它的项目都能得到通知,并自动更新这个包的版本号,那么就解决了包版本更新的问题,这就是观察者模式要解决的基本问题。
举例子如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。
对象与视图双向绑定在精读《设计模式 - Proxy 代理模式》中我们也提到了双向绑定概念,只不过代理是实现双向绑定的一个具体方案,而观察者模式才是在描述双向绑定这个概念。
观察者模式在最初提出的时候,就举了数据与 UI 相互绑定的例子。
即同一份数据可以同时渲染为表格与柱状图,那么当操作表格更新数据时,如何让柱状图的数据也刷新?从这个场景引出了对观察者模式的定义,即“数据” 与“UI” 是一对多的关系,我们需要一种设计模式实现当“数据” 变化时,所有依赖于它的“UI” 都得到通知并自动更新。
拍卖拍卖由一个拍卖员与多为拍卖者组成。
拍卖时,由 A 同学喊出的竞价(我出100)就是观察者向目标发出的setState同时,此时拍卖员喊出(有人出价100,还有更高的吗?)就是一个notify通知行为,拍卖员通知了现场竞价全员,刷新了他们对当前最高价的信息。
聊天室聊天室由一个中央服务器与多个客户端组成。
客户端发送消息后,就是向中央服务器发送了setState更新请求,此时中央服务器通知所有处于同一聊天室的客户端,更新他们的信息,从而完成一次消息的发送。
意图解释数据与 UI 的例子已经详细说明了其意图含义,这里就不赘述了。
结构图•Subject: 目标,即例子中的“数据”。
实验二观察者模式与装饰模式The following text is amended on 12 November 2020.实验报告课程名称java设计模式实验项目观察者模式与装饰模式的应用实验仪器 PC个人终端系别计算机学院专业软件工程班级/学号学生姓名阮翀实验日期 2015-10-12成绩指导教师张志华实验二观察者模式与装饰模式的应用一、实验目的通过该实验,理解观察者模式和装饰模式的意图、结构,在软件开发中使用这些模式并进行功能验证。
二、实验内容1.猫、狗与老鼠。
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
2.我跟妈妈说:“妈妈,我和妹妹在院子里玩。
饭做好了叫我们一声。
”请用观察者模式设计一个模拟系统。
3.采用装饰模式为图书馆中的项目(书或音像盘)增加“可借”功能。
使用Java语言设计一个模拟系统。
4.自定义JButton。
开发人员设计用户接口时,通常需要更多有特色的控件,Decorator模式就提供了一个方法去创造或修改现有的UI控件。
使用装饰模式实现一个带有对角线的按钮。
三、实验步骤与要求1.对于以上题目要认真分析和理解题意,在观察者模式和装饰模式题目中各选1个进行编程,程序中要求使用相应的模式。
2.上机录入,使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,此时可以采用观察者模式。
观察者模式意图:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
”观察者模式的UML类图:装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。
装饰模式意图:“动态地给对象添加一些额外的职责。
就功能来说装饰模式相比生成子类更为灵活。
”装饰模式的UML类图:五、上机报告内容1、班级、学号、姓名、实验完成日期;2、实验题目;3、设计方案:给出你的设计方案,包括结构类图及相关说明;4、源代码:设计方案中各个类和接口的源代码,包括测试主类的源代码.5、测试数据及运行结果6、总结:1)运用设计模式总结:对所运用的设计模式的名称,分类,意图,结构,角色作用的总结,所运用的面向对象设计原则。
2)选择一个题目进行说明:如果不使用观察者模式和装饰模式,你能想到其他方法解决问题吗,简要描述你的方案,并和采用命令模式的方案做简单比较。
3)本次实验遇到的问题、如何解决的;本次实验的经验、体会、改进设想等。
六、实验成绩考核方法实验成绩由出勤、实验完成情况以及实验报告综合评定。
考核成绩比例分配:出勤占15%、实验完成情况占50%、实验报告占35%七、上机安排本实验共需2个学时。
观察者模式public interface Subject {public void addObserver(Observer o);public void deleteObserver(Observer o);public void notifyObservers();}public interface Observer {public void SayHi(String heardMess);}public class Mouse implements Observer{public Subject subject;public Mouse(Subject subject){= subject;(this);}public void SayHi(String heardMess) {"我是观察者——老鼠,吱吱吱,我跑了!=。
=");}}public class Dog implements Observer {public Subject subject;public Dog(Subject subject) {= subject;(this);}public void SayHi(String heardMess) {"我是观察者——狗,犬吠~");}}importpublic class Cat implements Subject {String mess;boolean changed;ArrayList<Observer> animalsList;public Cat() {animalsList = new ArrayList<Observer>();mess = "Hi";changed = false;}public void addObserver(Observer o) {if (!(o))) {(o);}}@Overridepublic void deleteObserver(Observer o) {if (o)) {(o);}}@Overridepublic void notifyObservers() {for (int i = 0; i < (); i++) {Observer observer = (i);(mess);}}}public class Application {public static void main(String args[]){Cat newcat = new Cat();@SuppressWarnings("unused")Dog newdog = new Dog(newcat);String str = "我是猫,喵喵喵~";@SuppressWarnings("unused")Mouse newmouse = new Mouse(newcat);();}}装饰模式public abstract class Library {public abstract String book();}public class book extends Library{public final String str1= "tushu1";public String book() {return str1;}}public class BookDecorator extends Decorator{public final String STR = "可借";BookDecorator(Library library) {super(library);}public String newDecorator(){return STR;}@Overridepublic String book() {String str = null;str = () + newDecorator();return str;}}public abstract class Decorator extends Library{ protected Library library;public Decorator(){};public Decorator(Library library){= library;}}public class Application {public void showBook(Library library){String ste = ();}public static void main(String args[]){Application C = new Application();Library book = new book();Library at1 = new BookDecorator(book);Library at2 = new BookDecorator(at1);(at1);(at2);}}总结观察者模式观察者模式中通常有两个基本的概念主题:观察者和被观察者。
当被观察者状态发生改变时,需要通知相应的观察者,当然,每个被观察者所对应的观察者可能不知一个,他们之间是1:n的关系。
当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化。
观察者模式的效果有以下的优点:1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。
2.被观察者会向所有的登记过的观察者发出通知,观察者模式有下面的缺点:1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2.如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。
3.如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
4.虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
装饰模式装饰模式是是为己已有的功能到哪个态地添加更多功能的一种方式,当系统需要新功能的时候,要想旧类中添加新的代码,这些新的代码通常转世了原油类的核心职责或主要行为,在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类复杂性的特殊行为的需要,而装饰模式且提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个了类包装它所要装饰的对象,一次,当需要执行特殊行为时,客户端代就可以在云系那个时根据需要有选择地,按照顺帝使用装饰功能包装的对象了。
装饰者模式优点1、装饰者模式可以提供比继承更多的灵活性2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。
装饰者模式缺点1、会产生很多的小对象,增加了系统的复杂性2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。
6、装饰者会导致设计中出现许多的小对象,如果过度的使用,会让系统变得更加复杂。
7、装饰者和被装饰者对象有相同的超类型。
(装饰类和被装饰类之间的关系要搞清楚)。