梦想还是要有的,万一忘了咋办?

0%

装饰者模式

概述

动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。

类图

upload successful

角色

  • 抽象构建(Component)
    用于规范需要装饰的对象(原始对象)
  • 具体构件(ConcreteComponent)
    实现抽象构件接口,定义一个需要装饰的原始类。
  • 装饰角色(Decorator)  
    持有一个构件对象实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(Concrete Decorator)  
    负责对构件对象进行装饰。

示例

Component.java

1
2
3
public interface Component {
public void operation();
}

ConcreteComponent.java

1
2
3
4
5
public class ConceteComponent implements Component{
public void operation(){
  //业务代码
   }
}

Decorator.java

1
2
3
4
5
6
7
8
9
public abstract class Decorator implements Component{
private Component component=null;
public Decorator(Component component){
this.component=component;
}
public void operation(){
this.component.operation();
}
}

ConcreteDecorator.java

1
2
3
4
5
6
7
8
9
10
11
12
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component){
super(component);
}
private void method(){
System.out.println("method");
}
public void operation(){
this.method();
super.operation();
}
}

Client.java

1
2
3
4
5
6
7
public class Client{
public static void main(String args[]){
Component component =new ConcreateComponent();
component=new ConcreteDecorator(component);
component.operation();
}
}

应用

优点

  • 装饰类和被装饰类可以独立发展,而不会互相耦合。即Component 类无须知道Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件。
  • 装饰模式是继承关系的一个替代方案。装饰类Decorator,不管装饰多少层,返回的对象还是Component。
  • 装饰模式可以动态的扩展一个实现类的功能。

缺点

多层的装饰是比较复杂的。

使用场景

  • 需要扩展一个类的功能,或者给一个类增加附加功能。
  • 需要动态地给一个对象增加功能,这些工鞥呢可以再动态的撤销。
  • 需要为一批类进行改装或者加装功能。

装饰者是对继承的有力补充。单纯使用继承时,在一些情况下就会增加很多子类,而且灵活性差,维护也不容易。装饰模式可以替代继承者,解决类膨胀的问题,如Java基础类库中的输入输出流相关的类大量使用了装饰者模式。

实例

upload successful