Java设计模式--装饰模式

装饰模式(别名:包装类)

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

Decorator Pattern(Another Name: Wrapper)

Attach additional responsibilities to an object dynamically。Decorators provide a flexible alternative to subclassing for extending functionality.

类图

模式的结构与使用

装饰模式的结构中包括四个角色。

  • 抽象组件(Component):抽象组件是一个抽象类或者接口。抽象组件定义了“被装饰者”需要进行“装饰”的方法。
  • 具体产品(ConcreteComponent):具体组件是抽象组件的一个子类,具体组件的实例称为“被装饰者”。
  • 装饰(Decorator):装饰也是抽象组件的一个子类,但装饰还包含一个抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是抽象类也可以是一个非抽象类,如果是非抽象类,那么该类的实例称作“装饰者”。
  • 具体装饰(ConcreteDecorator):具体装饰是装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。

简单的例子

Component的接口类Bird.java

1
2
3
4
5
package Decorator;
public interface Bird {
public abstract int fly();
}

ConcreteComponent的实现类Sparrow.java

1
2
3
4
5
6
7
8
9
10
11
package Decorator;
public class Sparrow implements Bird {
private final int DISTANCE = 100;
@Override
public int fly() {
return DISTANCE;
}
}

Decorator的接口类Decorator.java

1
2
3
4
5
6
7
8
9
package Decorator;
public abstract class Decorator implements Bird {
public Bird bird;
public Decorator(Bird bird) {
this.bird = bird;
}
}

ConcreteDecorator的实现类SparrowDecorator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Decorator;
public class SparrowDecorator extends Decorator {
private final int DISTANCE = 50;
public SparrowDecorator(Bird bird) {
super(bird);
}
@Override
public int fly() {
return bird.fly() + elefly();
}
public int elefly() {
return DISTANCE;
}
}

测试类Application.java

1
2
3
4
5
6
7
8
9
10
11
package Decorator;
public class Application {
public static void main(String[] args) {
Bird sparrow = new Sparrow();
System.out.println(sparrow.fly());
Bird sparrowDecorator = new SparrowDecorator(sparrow);
System.out.println(sparrowDecorator.fly());
}
}

装饰模式的优点

  • 被装饰者和装饰者是松耦合关系。由于装饰(Decorator)仅仅依赖于抽象组件(Component),因此具体装饰只知道它要装饰的对象是抽象组件某一个子类的实例,但不需要知道是哪一个具体子类。
  • 装饰模式满足“开-闭原则”。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。
  • 可以使用多个具体装饰来装饰具体组件的实例。

适用装饰模式的情景

  • 程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。
  • 采用继承来增强对象功能不利于系统的扩展和维护。

下载源码请到

MyGitHub

文章目录
  1. 1. 装饰模式(别名:包装类)
  2. 2. Decorator Pattern(Another Name: Wrapper)
  3. 3. 类图
  4. 4. 模式的结构与使用
  5. 5. 简单的例子
    1. 5.1. Component的接口类Bird.java
    2. 5.2. ConcreteComponent的实现类Sparrow.java
    3. 5.3. Decorator的接口类Decorator.java
    4. 5.4. ConcreteDecorator的实现类SparrowDecorator.java
    5. 5.5. 测试类Application.java
  6. 6. 装饰模式的优点
  7. 7. 适用装饰模式的情景
  8. 8. 下载源码请到