装饰器模式
装饰器(Decorator)模式又名包装(Wrapper)模式,是一种能动态将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰器模式也体现了开闭原则(ocp),是一种继承关系的替代方案。
装饰器模式的四个角色
- 抽象构件(Component)角色:给出一个抽象接口,已规范准备接受附加责任对象。
- 具体构件(ConcreteComponent)角色:定义一个将要接受附加责任的类。
- 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- 具体装饰(ConcreteComponent)角色:负责给构件对象“贴上”附加的责任。
源代码
抽象构件:Component:
public interface Component {
public void sampleOperation();
}
具体构建:ConcreteComponent
public class ConcreteComponent implements Component {
@Override
public void sampleOperation() {
// 写相关的业务代码
}
}
装饰器:Decorator
public class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void sampleOperation() {
// 委派给构件
component.sampleOperation();
}
}
具体装饰器:ConcreteDecorator
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void sampleOperation() {
super.sampleOperation();
// 写相关的业务代码
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void sampleOperation() {
super.sampleOperation();
// 写相关的业务代码
}
}
Client:
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一种写法
Component concreteDecoratorA = new ConcreteDecoratorA(conponent);
Component concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);
// 第二种写法
//Component concreteDecoratorB = new concreteDecoratorB(new concreteDecoratorA(component));
concreteDecoratorB.sampleOperation();
}
}
参考资料: