`

设计模式学习笔记——装饰模式

阅读更多

 

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学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...

    HeadFirst设计模式笔记

    在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...

    软件设计师软考笔记.zip

    这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...

    UML分析与设计1

    本文将深入讲解两种在项目中应用的设计模式——Decorator模式和Template模式,并阐述它们在系统设计中的重要性和灵活性。 首先,Decorator模式是一种结构型设计模式,它允许在运行时为对象添加新的行为或职责,而...

    java io流学习笔记1

    Java IO流是Java平台中...总结,Java IO流是Java平台中处理输入输出的基础,其丰富的类库和设计模式为开发者提供了灵活、高效的数据传输手段。通过深入理解和熟练运用这些知识点,能够更好地应对各种IO相关的编程挑战。

    dotnet 读 WPF 源代码笔记 AppDomainShutdownMonitor 的设计.rar

    5. **设计模式**:在WPF源代码中,AppDomainShutdownMonitor可能采用了诸如观察者模式、工厂模式或者装饰器模式等设计模式来实现其功能。熟悉这些模式有助于理解其代码结构和意图。 6. **OpenXML**:虽然标签中提到...

    黑马前端css笔记.zip

    总结,"黑马前端css笔记.zip"包含了CSS3的重要知识点,如选择器扩展、媒体查询、响应式设计、渐变效果、布局技术(Flexbox和Grid)以及动画过渡等。这些内容对于前端开发人员深入理解和运用CSS3至关重要,能帮助他们...

    跃达创新java笔记

    12. **设计模式**:理解并应用常见的设计模式(如单例、工厂、观察者、装饰器等),可以提高代码的可维护性和复用性。 13. **Java EE**:对于进阶学习,了解Java企业级应用开发,如Servlet、JSP、JPA、Spring框架等...

    李兴华java word版全部笔记

    15. **设计模式**:涵盖了常见的设计模式,如单例、工厂、观察者、装饰者等,以及如何在实际编程中应用这些模式。 这份文档集是学习Java编程的宝贵资源,它不仅包含理论知识,还提供了丰富的示例代码,帮助学习者...

    java从刚刚开始到集合的详细代码和笔记教程.rar

    5. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式、装饰者模式等,有助于写出高效、可维护的代码。 6. **反射机制**:通过反射,可以在运行时动态地获取类的信息并调用其方法,增强程序的...

    python面试笔记项目

    【Python面试笔记项目】是为求职者准备的一份详尽的资源,...提供的三份笔记文件——"python面试笔记2.txt"、"python面试笔记.txt"、"python面试笔记3.txt",应包含更多具体问题和解答,为学习者提供更丰富的参考资料。

    行业分类-设备装置-一种数字化教学装饰构造室.zip

    总的来说,"行业分类-设备装置-一种数字化教学装饰构造室.zip"这个文件为我们揭示了教育领域的一个重要趋势——数字化教学空间的设计与建设。通过深入理解和应用其中的知识,我们可以为未来的教育改革提供有力的技术...

    全套百度云教程:python基础+进阶+项目篇 (含Django和Tornado)

    Django是一个用Python编写的开源Web框架,它遵循MVC(Model-View-Controller)设计模式,并且提供了一系列强大而灵活的功能来简化Web开发过程。 1. **Django安装与配置**:安装Django、创建项目、配置数据库等。 2....

    LeetCodeNote

    5. 设计模式:在解决问题的过程中,可能会涉及到单例模式、工厂模式、装饰器模式等常见设计模式的运用。 通过LeetCodeNote,你可以逐步掌握和巩固C#编程基础,同时提升解决实际问题的能力。这不仅有助于你在面试中...

    simplenotebook

    2. **模型-视图-控制器(MVC)设计模式**:可能在项目中实现,帮助理解如何组织代码以提高可维护性。 3. **文件操作**:学习如何读写笔记数据到本地文件,可能涉及到Java的I/O流和序列化技术。 4. **版本控制**:...

    DailySummary

    - 单例模式、工厂模式、装饰器模式等设计模式是面试中常被问及的话题,理解它们的应用场景和优点。 10. **JVM** - **内存模型**:堆、栈、方法区、本地方法栈和程序计数器的结构和功能。 - **垃圾回收**:理解GC...

    leetcode答案-leetcode:leetcode

    7. **设计模式**:在解题过程中可能会遇到一些通用的解决方案,如工厂模式、装饰器模式等,这些都是软件设计的重要组成部分。 通过深入学习和实践这些知识点,不仅可以提升我们的编程能力,也有助于我们在实际工作...

    圣诞树源码(免费下载无需积分)

    它不仅仅是一个供人欣赏的装饰品,更是一个可供学习和实践的平台。通过研究这个项目的源码,初学者可以了解到如何将HTML、CSS和JavaScript相结合,创造出既有视觉吸引力又能与用户产生互动的网页。同时,它也为那些...

    Android代码-使用Kotlin实现的一个简单的记事本App

    - **函数与扩展函数**:Kotlin允许开发者定义独立于任何类的函数,还可以对现有类添加功能而无需继承或使用装饰者模式,这就是扩展函数的作用。 2. **Android组件** - **Activity**:是Android应用的基本构建块,...

    jQuery带统计图表显示的房贷计算器代码.zip

    例如,可能有用于装饰的图标,或者用于表示货币、百分比等符号的图片。 对于想要进行二次开发的开发者,理解以上代码结构后,你可以考虑以下几点扩展: 1. **添加更多计算选项**:例如,可以增加公积金贷款、组合...

Global site tag (gtag.js) - Google Analytics