装饰模式是为已有功能动态地添加更多功能的一种方式。
由定义,给一个类或对象添加功能,为了不破坏类的结构,可以有两种方式:
abstract class Component {
public abstract void Operation();
}
public class ConcreateComponent extends Component {
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("basic operation");
}
}
public class Decorator extends Component {
protected Component component;
public void SetComponent(Component component) {
this.component = component;
}
@Override
public void Operation() {
// TODO Auto-generated method stub
if (component != null) {
component.Operation();
}
}
}
public class DecoratorA extends Decorator {
@Override
public void Operation() {
// TODO Auto-generated method stub
super.Operation();
newBehavior();
}
private void newBehavior() {
System.out.println("Add new behavior AAA");
}
}
public class DecoratorB extends Decorator {
@Override
public void Operation() {
// TODO Auto-generated method stub
super.Operation();
newBehavior();
}
private void newBehavior() {
System.out.println("Add new behavior BBB");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreateComponent c = new ConcreateComponent();
DecoratorA a = new DecoratorA();
DecoratorB b = new DecoratorB();
a.SetComponent(c);
a.Operation();
b.SetComponent(a);
b.Operation();
}
//输出
basic operation
Add new behavior AAA
basic operation
Add new behavior AAA
Add new behavior BBB
基本思路是,在ConcreateComponent做一些基本操作,然后创建装饰器,如果需要给对象增加新的特性,就把该对象放入对应的装饰器中。
尽量保持Component作为一个轻类,不要做太多逻辑。
优缺点
优点
缺点
使用场景
当系统需要新功能的时候,如果新功能只是为了满足某个条件下才会执行的行为,则不建议修改原类,而是使用装饰模式,把要装饰的功能放在特定类中,然后用这个类包装它所要装饰的对象。这样,客户代码可以根据情况在运行时选择装饰功能包装对象。