装饰模式:用于动态地给一个对象添加一些额外的职责。
一种为类增加功能的方式是:继承原有的类,在重载方法上添加新的职责(或业务逻辑),其实还有一种更好的方法,即为装饰模式。
《大话设计模式》中以给人穿衣服这样的过程,展示了动态穿衣的过程:
以人作为Component:
/**
* 例子比较简单,未使用Component的继承
* @author guozw
*
*/
public class Person {
private String name;
public void show(){
System.out.println(this.name+" wear");
}
public void setName(String name) {
this.name = name;
}
}
衣服这一抽象类,用于装饰Person:
/**
* 装饰类,继承并组合了Component
* @author guozw
*
*/
public abstract class Clothes extends Person {
private Person componment;
/**
* 进行装饰注入,形成链
* @param componmet
*/
public void Decorate(Person componmet){
this.componment=componmet;
}
@Override
public void show() {
componment.show();
}
}
各具体子类,覆盖超类的方法。
/**
* 各具体子类,覆盖超类的方法
* @author guozw
*
*/
public class TShirt extends Clothes{
@Override
public void show() {
System.out.println("T-shirt");
super.show();
}
}
public class BigTrousers extends Clothes {
@Override
public void show() {
System.out.println("Big Trousers");
super.show();
}
}
调用的过程,展现了逐步装饰和链式调用的过程
public static void main(String[] args) {
Person p = new Person();
p.setName("ABC");
TShirt t = new TShirt();
BigTrousers bt = new BigTrousers();
//逐步装饰
t.Decorate(p);
bt.Decorate(t);
bt.show();//链式调用
}
调用bt.show()方法将触发多态的链式调用,此例的顺序为 bt->t->person;很明显,后加入的,先被调用。
OK,给出下类图:
通过以上例子,我还想到了一些可以改变的地方:
- Decorator上可以按需包装多个component,当然这取决于具体的应用情况,但这样必须在装饰过程中依赖于构造装饰。
- component可以为interface,那样component就成为一个公用逻辑接口,一边成为原有业务逻辑职责持有者,一方(decorator)作为附加业务逻辑的实现者。
总结:
使用的场合:当系统需要新功能时,尤其是增加在某种特定情况下才会执行的行为时,可以考虑使用装饰模式。
装饰模式将每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。当需要执行特殊行为时,客户代码就可以在运行时有选择地,按顺序地使用装饰功能包装到对象。
优点:把类中的装饰功能从原有类中搬移出去,可以简化原有类,可以去除相关类中重复的装饰逻辑,可以任意组合装饰的顺序。
装饰模式最大的特征即为组合并继承某个类,这是多态威力的体现。
分享到:
相关推荐
奇幻RPG(物品锻造 与 Decorator模式)本文中,我们通过一个常见的给武器(对象)添加宝石(额外的状态和行为)的例子,讨论了Decorator设计模式的实现过程。
java Decorator模式的简单例子
Java类库中Decorator模式的应用研究
23种设计模式之八(结构型模式)Decorator模式
2022年Decorator模式中遭遇继承与聚合Java教程.docx
DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等。
这两种实体在Decorator模式中是必须的。 Decorator定义:动态给一个对象添加一些额外的职责,象在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 为什么使用Decorator 我们...
提供一种修改类的行为,而避免创建众多的派生类的途径。
NULL 博文链接:https://hubenhua1998.iteye.com/blog/1634700
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
主要介绍了Java设计模式之装饰模式(Decorator模式)介绍,本文讲解了为什么使用Decorator、如何使用装饰模式、Jive中的Decorator实现等内容,需要的朋友可以参考下
本文研究的主要是python实现Decorator模式,具体介绍如下。 一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子: # -*- coding: utf-8 -*- ...
本文实例讲述了Python使用logging结合decorator模式实现优化日志输出的方法。分享给大家供大家参考,具体如下: python内置的loging模块非常简便易用, 很适合程序运行日志的输出。 而结合python的装饰器模式,则可...
NULL 博文链接:https://xiangtui.iteye.com/blog/1033790
2.3 Decorator模式 2.4 Composite模式 2.5 Flyweight模式 2.6 Facade模式 2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 3.4 Observer模式 3.5 Memento模式 3.6 Mediator...