类图
在具体设计中,是否有Decorator、AbstractComponent这抽象层,可以灵活处理,比如:如果只有一种实现类ConcreteComponent,就没有必要做一个实现类的抽象了
工程目录
代码
AbstractComponent.java
package com.company.pattern.demo03;
/**
* 抽象接口
* @author blazar
*/
public abstract class AbstractComponent {
/**
* 抽象操作
*/
public abstract void operation();
}
ConcreteComponent.java
package com.company.pattern.demo03;
/**
* 定义一个具体的对象
* @author blazar
*/
public class ConcreteComponent extends AbstractComponent{
@Override
public void operation() {
System.out.println("具体对象的操作");
}
}
Decorator.java
package com.company.pattern.demo03;
/**
* 装饰抽象类,用于扩展AbstractComponent的功能,
* 但是对于AbstractComponent而言,是不需要知道Decorator的存在的
* @author blazar
*/
public class Decorator extends AbstractComponent{
protected AbstractComponent abstractComponent;
/**
* @param abstractComponent
*/
public void setAbstractComponent(AbstractComponent abstractComponent){
this.abstractComponent = abstractComponent;
}
@Override
public void operation() {
/**
* 重写Operation,实际上执行的是传入的AbstractComponent的Operation
*/
if(abstractComponent != null){
abstractComponent.operation();
}
}
}
ConcreteDecoratorA.java
package com.company.pattern.demo03;
/**
* @author blazar
*/
public class ConcreteDecoratorA extends Decorator{
/**
* ConcreteDecoratorA独有的功能
*/
private String addedState;
@Override
public void operation() {
super.operation();
addedState = "new state";
System.out.println("具体装饰对象A的操作");
}
}
ConcreteDecoratorB.java
package com.company.pattern.demo03;
/**
* @author blazar
*/
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
addedBehavior();
System.out.println("具体装饰对象B的操作");
}
/**
* ConcreteDecoratorB独有的功能
*/
private void addedBehavior(){
}
}
Main.java
package com.company.pattern.demo03;
/**
* @author blazar
*/
public class Main {
/**
* 装饰模式
*/
public static void main(String[] args) {
AbstractComponent abstractComponent = new ConcreteComponent();
ConcreteDecoratorA decoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB();
decoratorA.setAbstractComponent(abstractComponent);
decoratorB.setAbstractComponent(decoratorA);
decoratorB.operation();
}
}
测试结果
在原来的对象的方法执行的基础上,依次执行了装饰器的方法;
参考《大话设计模式》