动态的给一个对象添加一些额外的职责。
装饰者模式通常有4个角色,就增加功能来说,装饰者模式比生成子类更加的灵活。
Component:抽象构件。通常是一个接口或者抽象类,定义最核心最原始的对象。
public interface AbstractComponent {
/**
* 抽象方法
*/
void operate();
}
ConcreteComponent:具体构件。抽象构件的实现,即被装饰的对象。
public class Component implements AbstractComponent {
@Override
public void operate() {
System.out.println("do something!");
}
}
Decorator:抽象装饰者角色。通常是一个抽象类,可设置一个被装饰对象。
public abstract class Decorator implements AbstractComponent {
/** 定义一个装饰构件 **/
private AbstractComponent abstractComponent;
/**
* 通过构造函数设置被装饰者
* @param abstractComponent
*/
public Decorator(AbstractComponent abstractComponent) {
this.abstractComponent = abstractComponent;
}
/**
* 委托被装饰着执行
*/
@Override
public void operate() {
this.abstractComponent.operate();
}
}
ConcreteDecorator:具体装饰者角色。实现对构件的功能职责的扩展。
public class DecoratorOne extends Decorator {
/**
* 通过构造函数设置被装饰者
*
* @param abstractComponent
*/
public DecoratorOne(AbstractComponent abstractComponent) {
super(abstractComponent);
}
/**
* 定义自己的装饰方法
*/
private void methodOne() {
System.out.println("DecoratorOne.methodOne 装饰");
}
/**
* 重写被装饰对象的方法
*/
@Override
public void operate() {
this.methodOne();
super.operate();
}
}
public class DecoratorTwo extends Decorator {
/**
* 通过构造函数设置被装饰者
*
* @param abstractComponent
*/
public DecoratorTwo(AbstractComponent abstractComponent) {
super(abstractComponent);
}
/**
* 定义自己的装饰方法
*/
private void methodTwo() {
System.out.println("DecoratorTwo.methodTwo 装饰");
}
/**
* 重写被装饰对象的方法
*/
@Override
public void operate() {
super.operate();
this.methodTwo();
}
}
场景类
public class Client {
public static void main(String[] args) {
/** 定义被装饰着 **/
AbstractComponent component = new Component();
/** 第一次装饰 **/
component = new DecoratorOne(component);
/** 第二次装饰 **/
component = new DecoratorTwo(component);
component.operate();
}
}
联系客服