装饰者模式(Decorator)可以动态的将职责附加到对象上。若要扩展功能,装饰者提供了比继承更加弹性的解决方案。
刚阅读的时候可能会产生疑惑,装饰者持有了超类的一个引用,目的是为了能够拥有被装饰者的行为,这时候会觉得和继承好像没有差别,因为继承其实也是保留了父类的一个引用的,那在子类中调用super.operation()不是一样的效果吗?后来仔细的想想,应该用发展的眼光来看问题,当类的数量只有几个的时候,似乎是用继承也能达到效果,但是想到那句老话,继承是在编译时静态的决定了子类的行为。而组合的好处是可以在运行时动态的扩展行为。使用继承来实现的话,会导致类的数量成指数级增长。
由于继承是静态的,就要在使用前将所有的类写好,形成一颗很复杂的树(单继承情况下)或者网(可以多继承),考虑完所有情况后,使用者挑一个类来使用。而装饰者模式相当于把节点配置好,让使用者来构建自己需要的组合。这样当要新加入一个行为的使用,前者会产生巨大的麻烦,而后者只相当于添加一个节点。
按现实生活中来理解的话,就是为一个主体附加上功能。机械的组装可能比较好理解。假如我们需要能飞行的汽车,那我们的主体是汽车。按继承来实现,设计一个飞行汽车类继承汽车类,按装饰者来实现则是飞行器装饰者类,汽车主体类,然后在使用时候组装:飞行器装饰者(汽车主体类);这样看起来,两者差别不是很大。当我们出现新的要求,需要一个能飞行,能入水的汽车。继承使用者就要添加飞行入水汽车类继承飞行汽车类,那如果只能入水呢?于是继承使用者又要添加入水汽车类。而装饰器使用者只需增加水中推进器装饰者类,使用时组装:水中推进器装饰者(飞行器装饰者(汽车主体类)),入水的话就组装:水中推进器装饰者(汽车主体类)。如果我们要添加自行车主体呢?继承使用者就有的忙了,要设计能飞行,能入水,同时能飞行和入水的三个类。而装饰者模式只要添加自行车主体类就可以了。
我们来看看该模式具体是怎么实现的,图是从别人博客中截来的,不过原图是《HeadFirst 设计模式》里面的:
图中ConcreteComponent就是待装饰的主体,ConcreteDecoratorA和B就是具体的装饰者,这里需要特别注意的地方时,Decorator既继承了Component,又组合(component= contains-a) Component;我们需要知道的是Decorator继承Component并不是为了获得Component的行为(它已经组合了Component了,可以获得行为),而是为了使Decorator和ConcreteComponent类型匹配,这样的话,装饰者可以继续装饰被装饰过的对象。
在java中,装饰者使用体现在了io类的设计上,初学者使用的时候可能会感到疑惑对类似的代码:
BufferedReader br =new BufferedReader(new FileReader(new File( "D:\\1.xls")));
在了解了装饰器模式后,我们就可以明白,这是使用了装饰器来为主体类拓展行为。具体可以查阅io类的UML图可以有进一步的体会
分享到:
相关推荐
在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...
《C++20设计模式》学习笔记-第9章装饰器模式-配套代码
这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...
结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。
1. 装饰者设计模式-是什么 2. 装饰者设计模式-定义 3. 装饰者设计模式-模拟网关权限控制 4. 装饰者设计模式-测试
以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...
创建型设计模式关注的是对象的创建,如工厂方法、抽象工厂、建造者、原型和单例模式,它们分别处理不同程度的对象创建延迟和实例化过程。结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...
### 面向对象与设计模式基础知识点梳理 #### 一、面向对象的基本概念 **面向对象编程(Object-Oriented Programming, OOP)** 是一种编程范式,其核心思想是将现实世界中的事物抽象成类(Class),并通过类创建...
3. **观察者模式**:行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在事件驱动编程中,如GUI组件间的交互,广泛使用此模式。 4. **...
《新版设计模式手册》中的笔记通过21个设计模式的概念图,直观地展示了这些模式的结构和交互方式,帮助读者形成清晰的认识。同时,生活类比将复杂的编程概念与日常经验相结合,使学习更加生动有趣。例如,单例模式...
### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...
设计模式是软件工程中的一种通用解决方案,它是在特定上下文中解决常见问题的经验总结。这个“23种设计模式学习笔记”文档将引导...通过阅读“设计模式学习笔记.doc”,你可以逐一了解并掌握这些模式的原理和使用场景。
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...