意图:动态的给一个对象添加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更为灵活。
别名:Wrapper
结构图如下:
[img]http://dl.iteye.com/upload/attachment/0063/9712/f6f110e7-ab47-3f17-85c4-648d1fc5792c.png[/img]
Decorator维持一个指向Component对象的引用,并定义一个与Component接口一致的接口。
ConcreteDecorator则是负责向ConcreteComponent添加职责的类
Decorator将Operation()请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的操作。
示例代码如下
客户端使用
运行结果
总结
1. 装饰模式符合开-闭原则,如果需要增加新的功能,只需要增加一个ConcreteDecoratorC等等,不需要修改其它的类,只要在客户端实例化一个ConcreteDecoratorC对象即可
2. 调整ConcreteDecorator中Operation实现时父类Operation与子类操作的顺序,可以调整装饰的操作顺序
运行结果
别名:Wrapper
结构图如下:
[img]http://dl.iteye.com/upload/attachment/0063/9712/f6f110e7-ab47-3f17-85c4-648d1fc5792c.png[/img]
Decorator维持一个指向Component对象的引用,并定义一个与Component接口一致的接口。
ConcreteDecorator则是负责向ConcreteComponent添加职责的类
Decorator将Operation()请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的操作。
示例代码如下
public abstract class Component {
public abstract void Operation();
}
public class Decorator extends Component {
protected Component component;
@Override
public void Operation() {
// TODO Auto-generated method stub
if (component != null) {
component.Operation();
}
}
public void Decorate(Component component) {
this.component = component;
}
}
public class ConcreteComponent extends Component {
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("ConcreteComponent Operation");
}
}
public class ConcreteDecoratorA extends Decorator {
private String addedState;
@Override
public void Operation() {
super.Operation();
addedState = "Add a New State";
System.out.println("ConcreteDecoratorA Decorate Operation");
}
}
public class ConcreteDecoratorB extends Decorator {
@Override
public void Operation() {
super.Operation();
AddedBehavior();
System.out.println("ConcreteDecoratorB Decorate operation");
}
private void AddedBehavior() {
System.out.println("ConcreteDecoratorB private behavior");
}
}
客户端使用
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteComponent obj = new ConcreteComponent();
ConcreteDecoratorA da = new ConcreteDecoratorA();
ConcreteDecoratorB db = new ConcreteDecoratorB();
System.out.println("Decorate obj");
da.Decorate(obj);
db.Decorate(da);
db.Operation();
}
}
运行结果
Decorate obj
ConcreteComponent Operation
ConcreteDecoratorA Decorate Operation
ConcreteDecoratorB private behavior
ConcreteDecoratorB Decorate operation
总结
1. 装饰模式符合开-闭原则,如果需要增加新的功能,只需要增加一个ConcreteDecoratorC等等,不需要修改其它的类,只要在客户端实例化一个ConcreteDecoratorC对象即可
ConcreteDecoratorC dc = new ConcreteDecoratorC();
dc.Decorate(db);
dc.Operation();
2. 调整ConcreteDecorator中Operation实现时父类Operation与子类操作的顺序,可以调整装饰的操作顺序
public class ConcreteDecoratorA extends Decorator {
private String addedState;
@Override
public void Operation() {
addedState = "Add a New State";
System.out.println("ConcreteDecoratorA Decorate Operation");
super.Operation();
}
}
public class ConcreteDecoratorB extends Decorator {
@Override
public void Operation() {
AddedBehavior();
System.out.println("ConcreteDecoratorB Decorate operation");
super.Operation();
}
private void AddedBehavior() {
System.out.println("ConcreteDecoratorB private behavior");
}
}
运行结果
Decorate obj
ConcreteDecoratorB private behavior
ConcreteDecoratorB Decorate operation
ConcreteDecoratorA Decorate Operation
ConcreteComponent Operation