装饰者模式——
Decorator
有时间还是看一下《
Java
设计模式》,临近期末,为了节省时间我直接找了一些资料总结了一下。
1. Decorator
好处
/
目的
:
A.
如果使用继承
实现功能扩展:
我们通常使用继承来实现功能扩展,随着这些需要扩展的功能的增多,扩展功能的组合会导致更多的子类的膨胀。
同时,使用继承实现功能的扩展,我们必须可预见这些拓展功能,这些功能编译时就确定了,是静态的。
B.
如果使用
Decorator
实现功能扩展:
如果扩展功能需要由用户动态决定加入的方式和时机,
Decorator
提供了“即插即用”的方法,即在运行期间决定何时增加何种功能。
这样,避免了在层次结构高层有太多的特征,
Decorator
模式提供了一种“即插即用”的方法添加职责,他并不试图在一个复杂的可定制的类中支持所有可预见的特征;相反,可以定义一个简单的类,并且用
Decorator
类给他们逐渐添加功能,可以从简单的部件组合出复杂的功能。
总结:
The intent
of Decorator is to let you compose new variations
of an operation at runtime
.
2.
如何使用
Decorator
:
图
. Decorator
模式
注意到,装饰者类
Decorator
既在①内部将被装饰者
Component
作为成员(保证请求的传递,不必实现
ConcreteComponent
已经实现的功能);又②实现了
Component
接口(保证客户端使用
Decorator
就如同使用
Component
一样)
如何记忆:
(1)记住Decorator到Component的两条线:关联——为了构造函数能传入Component;继承——为了构造函数能返回Component.
(2)被装饰者一定要有抽象接口Component:这样才能支持装饰者模式!
3. Decorator
举例
:
实际上,
Java
的
I/O API
就是使用
Decorator
实现的,如果采用继承的方式,将会产生很多很多子类!
下面仅通过一个简单的例子实现上面图中的功能。
客户端代码:
package decorator;
public class Client {
public static void main(String[] args) {
Component component=new ConcreteComponent();
Component decorator=new Decorator(component);
component.setName("小王");
System.out.println(component.getName());
decorator.setName("小王");
System.out.println(decorator.getName());
}
}
被装饰者和被装饰者实现:
package decorator;
public interface Component {
public void setName(String name);
public String getName();
}
public class ConcreteComponent implements Component {
String name;
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name=name;
}
}
装饰者:
package decorator;
public class Decorator implements Component {
//如果有多个组件,可能用到private List<Component> list;
private Component component;
public Decorator(Component c){
component=c;
}
@Override
public String getName() {
/*
* 在name前加上"名字是: "——这个效果就是装饰者达到的作用
*/
return "名字是: "+component.getName();
}
@Override
public void setName(String name) {
component.setName(name);
}
}
输出效果:
参见《设计模式》板桥里人
http://www.jdon.com 2002/04/28
参见
装饰模式
(Decorator)
解析例子
,http://tianli.blog.51cto.com/190322/35287
参见《
Java
设计模式》
- 大小: 10.1 KB
- 大小: 3.6 KB
分享到:
相关推荐
【标题】:“装饰者模式(decorator)在Head First设计模式中的详解” 【内容】: 装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的...
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
一、模式概述一个场景是我们要为一个对象动态添加新的职责,这个职责并不修改原有的行为,而是在原有行为基础上添加新的功能,就好比装饰工人为一座新居的墙上涂抹上色彩缤纷的颜料一般。 从我们拥有的面向对象的...
装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。
2. **动态性**:装饰模式允许我们在运行时动态地为对象添加新功能,而无需修改代码。 3. **组合性**:通过多个装饰者的叠加,可以实现更复杂的功能,这比使用继承来扩展功能更加灵活。 4. **职责分离**:装饰者模式...
`Decorator`类是装饰模式的核心,它实现了`VisualComponent`接口,并包含一个对`VisualComponent`类型的引用。`Decorator`类的目的是为了包装一个`VisualComponent`对象,并在其基础上添加额外的行为。在本例中,...
装饰者模式是一种设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改对象本身的代码。在C++中实现装饰者模式,我们可以遵循以下步骤和关键概念: 1. **定义接口**:首先,我们需要定义一个基础...
在PHP5中,装饰者模式的应用可以帮助我们保持代码的灵活性,使得扩展功能变得容易,同时也遵循了开闭原则——对扩展开放,对修改关闭。 ### 一、装饰者模式的核心概念 1. **组件(Component)**:这是所有对象的...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改对象的源代码或继承体系。装饰者模式的核心思想是将对象的原始功能与增强功能分离开来,使得在不改变原有对象的...
在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...
装饰者模式(Decorator Pattern)是一种行为设计模式,它允许在运行时给对象添加新的功能,同时又不破坏其原有的结构。这种模式的核心在于通过包装(wrapping)原对象,为对象添加额外的职责,而无需修改原对象的...
装饰器(Decorator)模式是一种设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术,尤其在不破坏原有类结构的情况下扩展...
8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) ...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
装饰模式是一种结构型设计模式...装饰模式使得代码更易于维护和扩展,符合面向对象设计原则中的开闭原则——对扩展开放,对修改关闭。因此,装饰模式在处理类似售卖咖啡这样的可扩展场景时,是一种非常实用的设计模式。
整个装饰模式的结构是按照组合模式来实现的——两者都有类似的结构图,都基于递归组合来组织可变数目的对象。 与组合模式的区别 装饰模式和组合模式都基于递归组合来组织可变数目的对象,但是两者的目的是截然不同...