装饰模式
/结构型/ 亦称:装饰者模式、装饰器模式、Wrapper、Decorator
参考:refactoringguru 、RUNOOB、 大话数据结构第六章
装饰模式: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活
通过override
和super
来做到修饰,本体功能的扩展
package core;
public abstract class Component {
public abstract void Operation();
}
package core;
public class ConcrateComponent extends Component{
@Override
public void Operation() {
// TODO Auto-generated method stub
System.out.println("具体对象的操作!");
}
}
package core;
public abstract 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();
}
}
}
package core;
public class ConcreteDecoratorA extends Decorator{
private String addedState;
@Override
public void Operation() {
// TODO Auto-generated method stub
super.Operation();
addedState = "new State";
System.out.println("具体修饰对象A的操作!");
}
}
package core;
public class ConcreteDecoratorB extends Decorator{
private void AddedBehavior() {
// TODO Auto-generated method stub
}
@Override
public void Operation() {
// TODO Auto-generated method stub
super.Operation();
AddedBehavior();
System.out.println("具体修饰对象B的操作!");
}
}
package Server;
import core.ConcrateComponent;
import core.ConcreteDecoratorA;
import core.ConcreteDecoratorB;
public class test {
public static void main(String[] args) {
ConcrateComponent c = new ConcrateComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.setComponent(c);
d2.setComponent(d1);
d2.Operation();
}
}
output:
具体对象的操作!
具体修饰对象A的操作!
具体修饰对象B的操作!
关键:super
调用原来的Operation
()再执行修饰类中的功能,如此相当于对原Component
进行了修饰。
总结: 修饰模式是利用SetComponent
来对对象进行包装,这样每个修饰对象(ConcreteDecoratorA
)的实现就和如何使用这个对象分离开了,每个修饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
变式: 如果只有一个ConcreteComponent
类而没有抽象的Component
类,那么Decorator
类可以是ConcreteComponent
的一个子类。
如果中有一个ConcreteDecorator
类,那么也没必要单独建一个Decorator
类,而可以把Decorator
和ConcreteDecorator
的责任合并成一个类。