装饰模式定义
装饰模式(Decorator Pattern)是一种比较常见的设计模式,其定义如下:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provides a flexible alternative to subclassing for extending functionality. 即:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子规则更为灵活。
装饰模式的通用类图如下:
![](https://img.haomeiwen.com/i53727/c7fc4ae924b6f493.jpg)
装饰模式的通用代码如下:
//抽象被装饰者,组建
public abstract class Component{
//抽象方法
public abstract void operate();
}
//具体被装饰者,组建
public class ConcreteComponent extends Component{
@Override
public void operate() {
System.out.println("Component operate...");
}
}
public abstract class Decorator extends Component{
private Component component = null;
//通过构造函数传递被装饰者
public Decorator(Component component){
this.component = component;
}
@Override
public void operate(){
this.component.operate();
}
//定义修饰方法
protected abstract void decorate();
}
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
@Override
protected void decorate() {
System.out.println("ConcreteDecorator 1 decorate...");
}
@Override
public void operate(){
this.decorate();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component) {
super(component);
}
@Override
protected void decorate() {
System.out.println("ConcreteDecorator 2 decorate...");
}
@Override
public void operate(){
super.operate();
this.decorate();
}
}
//客户端
public class DecoratorClient{
public static void main(String[] args) {
Component component = new ConcreteComponent();
//第一次装饰
component = new ConcreteDecorator1(component);
//第二次装饰
component = new ConcreteDecorator2(component);
component.operate();
}
}
代码运行结果如下:
ConcreteDecorator 1 decorate...
Component operate...
ConcreteDecorator 2 decorate...
装饰模式的应用
装饰模式的优点
- 装饰类和被装饰类可以独立发展,不会相互耦合。即:Component类无须知道Decorator类,Decorator是从外部扩展Component,而Decorator也不用知道Component的构件。
- 装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管封装多少层,返回的对象依旧是Component类对象。
- 装饰模式可以动态地扩展一个实现类的功能。
装饰模式的缺点
- 多层的装饰是比较复杂的,因此尽量减少装饰类的数量以降低系统的复杂度。
装饰模式的使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态地给一个对象增加功能。
- 需要为一批的兄弟类进行改装或加装功能。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。
网友评论