作用:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。
装饰模式的优点:
(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰模式的缺点:
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
实现案例:
1、首先定义一个抽象构件(Component
)角色:
public interface IMessageHandler <T> {
public Object createMessage(T request) throws Exception;
}
2、定义一个装饰(Decorator
)角色:
其中定义一个本身的引用是重点
public class MessageHandlerDecorator implements IMessageHandler<Object>{
/* 定义本身的引用 */
protected MessageHandlerDecorator messageHandler;
/*
* 父类默认createMessage方法
*/
@Override
public Object createMessage(Object request) throws Exception {
System.out.println("我是最初的createMessage功能");
if(messageHandler != null){
return messageHandler.createMessage(request);
}
return new Object();
}
public MessageHandlerDecorator getMessageHandlerDecorator() {
return messageHandler;
}
public void setMessageHandlerDecorator(MessageHandlerDecorator messageHandler) {
this.messageHandler = messageHandler;
}
}
3、定义多个具体装饰(ConcreteDecorator
)角色(负责给构件对象“贴上”附加的责任,既在装饰角色及基础上增加额外的功能):
A_MessageHandler.java
public class A_MessageHandler extends MessageHandlerDecorator {
/*
* 扩展类 A_MessageHandler 的createMessage方法
*/
@Override
public Object createMessage(Object request) throws Exception {
/* 先执行父类的功能 */
Object result = super.createMessage(request);
System.out.println("执行该子类的附加指责");
// ... result 对result结果再进行额外的 A 加工;
return result;
}
}
B_MessageHandler.java
public class B_MessageHandler extends MessageHandlerDecorator {
/*
* 扩展类 B_MessageHandler 的createMessage方法
*/
@Override
public Object createMessage(Object request) throws Exception {
/* 先执行父类的功能 */
Object result = super.createMessage(request);
System.out.println("执行该子类的附加指责");
// ... result 对result结果再进行额外的 B 加工;
return result;
}
}
C_MessageHandler.java
public class C_MessageHandler extends MessageHandlerDecorator {
/*
* 扩展类 C_MessageHandler 的createMessage方法
*/
@Override
public Object createMessage(Object request) throws Exception {
/* 该方法需要借助 B 加工的结果 */
this.messageHandler = new B_MessageHandler();
Object result = super.createMessage(request);
System.out.println("执行该子类的附加指责");
// ... result 对result结果再进行额外的 C 加工;
return result;
}
}
通常我们可以把这多个具体的装饰角色交由工厂进行管理,如使用MapFactoryBean
管理,此处不再赘述。