1、定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
2、描述
由
抽象构件角色(定义一个抽象接口,来规范准备附加功能的类)、具体构件角色(将要被附加功能的类,实现抽象构件角色接口)、抽象装饰者角色(持有对具体构件角色的引用并定义与抽象构件角色一致的接口)和具体装饰角色(实现抽象装饰者角色,负责为具体构件添加额外功能)组成。
3、UML类图
4、Demo
/**
* 装饰者和组建的共同方法接口(抽象构件角色)
*/
interface Component {
public void justDoIt();
}
/**
* 组件(具体构件角色)
*/
class ConcreteComponent implements Component{
public void justDoIt() {
System.out.println("具体组件的方法,justDoIt!");
}
}
/**
* 抽象装饰者
*/
abstract class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
/**
* 组件方法执行前预处理方法
*/
protected void preDo(){};
/**
* 组件方法执行后处理方法
*/
protected void afterDo(){};
public void justDoIt(){
preDo();
component.justDoIt();
afterDo();
};
}
/**
* 具体装饰者
*/
class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
/**
* 根据需要重载模板类preSay()方法
*/
protected void preDo(){
System.out.println("ConcreteDecorator1.preDo()");
}
/**
* 根据需要重载模板类afterSay()方法
*/
protected void afterDo(){
System.out.println("ConcreteDecorator1.afterDo()");
}
}
/**
* 装饰者
*/
class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component) {
super(component);
}
/**
* 根据需要重载模板类preSay()方法
*/
protected void preDo(){
System.out.println("ConcreteDecorator2.preDo()");
}
/**
* 根据需要重载模板类afterSay()方法
*/
protected void afterDo(){
System.out.println("ConcreteDecorator2.afterDo()");
}
}
public class DecoratorGenerater{
public static void main(String[] args) {
Component component = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent()));
component.justDoIt();
}
}
5、IO类的装饰者模式实现