Decorator 装饰模式
又被称为包裹模式Wrap
●以对客户透明的方式动态给一个对象附加更多的责任,客户端不会感觉装饰前后对象有何不同。
●装饰模式可以在不使用创造更多子类的情狂下,将对象的功能加以扩展。
装饰模式的对象图是呈链状结构的
比较懒 依旧盗版过来一张类图:
下面是代码,来看看他们都是如何构建的:
首先是Component 他是一个抽象接口,以规范准备接受附加责任的对象
public interface Component {
void sampleOperation();
}
之后是ConcreteComponent 这是具体构件角色,定义了一个将要接受附加责任的类
public class ConcreteComponent implements Component{
public ConcreteComponent(){
}
public void sampleOperation(){
System.out.println("ConcreteComponent Operation");
}
}
关键的Decorator角色 他持有一个Component对象的实例,并定义一个于抽象构件接口一致的接口
public class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component=component;
}
public void sampleOperation(){
component.sampleOperation();
}
}
最后当然是具体的装饰部分了 负责给构建添加各自的附加责任 这里只其中一个addOperate
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component){
super(component);
}
public void sampleOperation(){
addOperation();
super.sampleOperation();
}
private void addOperation(){
System.out.println("addOperation");
}
}
最后的结果:
public class DecoratorDesignPattern {
public static void main(String[] args){
Component component = new ConcreteComponent();
component.sampleOperation();
Component component2 = new ConcreteDecorator(component);
component2.sampleOperation();
}
}
输出:
ConcreteComponent Operation
addOperation
ConcreteComponent Operation
很明显component2仍然是Component对象 所以可以无限的嵌套。。。
使用装饰模式的情况:
1 需要扩展一个类的功能,或者给一个类增加附加责任
2 需要动态地给一个对象增加功能,这些功能可以再动态地撤销
3 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实
装饰模式的优缺点:
1 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供更多的灵活性
2 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合
3 装饰模式比继承更加容易出错
4 装饰模式相比继承产生较少的类,但同时生成更多的对象 并且这些对象看上去都比较相似
简化装饰模式
1 装饰类接口必须与被装饰类接口相容(ConcreteDecorator类必须继承自同一父类Component)
2 尽量保持Conponent作为一个“轻”类(可以是接口 也可以是抽象类 具体类)
3 若没有Component抽象类 只有ConcreteConponent 则Decorator类通常可以是其子类
4 若ConcreteDecorator类数目比较多,就有使用一个单独Decorator类来区分抽象和具体职责的必要,肉则可以将Decorator和ConcreteDecorator合并
注意,应该声明的是一个Component类型的变量(对客户端是透明的 看起来完全一样 而不是具体的ConcreteComponent)
大多数情况是半透明的装饰模式 介于装饰模式和适配器之间
装饰模式与其他模式的对比
装饰模式和适配器模式
装饰模式——保持端口,增强所考虑对象的性能
适配器模式——改变所考虑对象的接口,而不一定改变对象的性能
装饰模式和策略模式
装饰模式——表皮换掉,保持内心 要求Component尽量轻
策略模式——保持接口不变,使具体算法可以互换 抽象策略类尽量重
装饰模式和合成模式
装饰模式常常用于合成模式的行为扩展上,是集成的替代方案。
Java中的IO部分中存在大量适配器模式和装饰模式
- 大小: 40.5 KB
分享到:
相关推荐
【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...
在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...
这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...
本文将深入讲解两种在项目中应用的设计模式——Decorator模式和Template模式,并阐述它们在系统设计中的重要性和灵活性。 首先,Decorator模式是一种结构型设计模式,它允许在运行时为对象添加新的行为或职责,而...
Java IO流是Java平台中...总结,Java IO流是Java平台中处理输入输出的基础,其丰富的类库和设计模式为开发者提供了灵活、高效的数据传输手段。通过深入理解和熟练运用这些知识点,能够更好地应对各种IO相关的编程挑战。
5. **设计模式**:在WPF源代码中,AppDomainShutdownMonitor可能采用了诸如观察者模式、工厂模式或者装饰器模式等设计模式来实现其功能。熟悉这些模式有助于理解其代码结构和意图。 6. **OpenXML**:虽然标签中提到...
总结,"黑马前端css笔记.zip"包含了CSS3的重要知识点,如选择器扩展、媒体查询、响应式设计、渐变效果、布局技术(Flexbox和Grid)以及动画过渡等。这些内容对于前端开发人员深入理解和运用CSS3至关重要,能帮助他们...
12. **设计模式**:理解并应用常见的设计模式(如单例、工厂、观察者、装饰器等),可以提高代码的可维护性和复用性。 13. **Java EE**:对于进阶学习,了解Java企业级应用开发,如Servlet、JSP、JPA、Spring框架等...
15. **设计模式**:涵盖了常见的设计模式,如单例、工厂、观察者、装饰者等,以及如何在实际编程中应用这些模式。 这份文档集是学习Java编程的宝贵资源,它不仅包含理论知识,还提供了丰富的示例代码,帮助学习者...
5. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式、装饰者模式等,有助于写出高效、可维护的代码。 6. **反射机制**:通过反射,可以在运行时动态地获取类的信息并调用其方法,增强程序的...
【Python面试笔记项目】是为求职者准备的一份详尽的资源,...提供的三份笔记文件——"python面试笔记2.txt"、"python面试笔记.txt"、"python面试笔记3.txt",应包含更多具体问题和解答,为学习者提供更丰富的参考资料。
总的来说,"行业分类-设备装置-一种数字化教学装饰构造室.zip"这个文件为我们揭示了教育领域的一个重要趋势——数字化教学空间的设计与建设。通过深入理解和应用其中的知识,我们可以为未来的教育改革提供有力的技术...
Django是一个用Python编写的开源Web框架,它遵循MVC(Model-View-Controller)设计模式,并且提供了一系列强大而灵活的功能来简化Web开发过程。 1. **Django安装与配置**:安装Django、创建项目、配置数据库等。 2....
5. 设计模式:在解决问题的过程中,可能会涉及到单例模式、工厂模式、装饰器模式等常见设计模式的运用。 通过LeetCodeNote,你可以逐步掌握和巩固C#编程基础,同时提升解决实际问题的能力。这不仅有助于你在面试中...
2. **模型-视图-控制器(MVC)设计模式**:可能在项目中实现,帮助理解如何组织代码以提高可维护性。 3. **文件操作**:学习如何读写笔记数据到本地文件,可能涉及到Java的I/O流和序列化技术。 4. **版本控制**:...
- 单例模式、工厂模式、装饰器模式等设计模式是面试中常被问及的话题,理解它们的应用场景和优点。 10. **JVM** - **内存模型**:堆、栈、方法区、本地方法栈和程序计数器的结构和功能。 - **垃圾回收**:理解GC...
7. **设计模式**:在解题过程中可能会遇到一些通用的解决方案,如工厂模式、装饰器模式等,这些都是软件设计的重要组成部分。 通过深入学习和实践这些知识点,不仅可以提升我们的编程能力,也有助于我们在实际工作...
- **函数与扩展函数**:Kotlin允许开发者定义独立于任何类的函数,还可以对现有类添加功能而无需继承或使用装饰者模式,这就是扩展函数的作用。 2. **Android组件** - **Activity**:是Android应用的基本构建块,...
例如,可能有用于装饰的图标,或者用于表示货币、百分比等符号的图片。 对于想要进行二次开发的开发者,理解以上代码结构后,你可以考虑以下几点扩展: 1. **添加更多计算选项**:例如,可以增加公积金贷款、组合...
**CSS3.0详解——飘零雾雨版** CSS3.0是层叠样式表(Cascading Style Sheets)的最新版本,它极大地扩展了网页设计的灵活性和表现力,为开发者提供了更多创新的可能性。"飘零雾雨版"可能是指这个资料集中的独特解读...