装饰器模式
装饰器模式就是在不改变原来设计的同时,动态的给对象添加一些额外的功能(加强原来的功能/拓展原来对象没有的功能)。
UML图示
装饰器模式中的角色
抽象组件(Component):抽象类,规定了被装饰者需要进行修饰的方法。
具体组件(ComponentImpl):类,本类的实例被称为‘被装饰者’。
装饰(Decorator): 类,继承并拥有抽象组件(子)类的实例对象。
具体装饰(DecoratorImpl): 类,该类的实例被称为‘装饰者’。
装饰器模式举例
普通的鸟可以飞行10km,但现在有一种加强型的鸟可以飞行15km,另外还有一中可以飞行20km的鸟。使用装饰器模式来完成设计。
- Bird.java
public abstract class Bird {
public abstract int fly();
}
- NormalBird.java
public class NormalBird extends Bird {
private static final int DISTANCE = 50;
public int fly(){
return DISTANCE;
}
}
- BirdEnhance.java
public abstract class BirdEnhance extends Bird {
protected Bird bird;
BirdEnhance(){
}
BirdEnhance(Bird bird){
this.bird = bird;
}
}
- EnhancedBird.java
public class EnhancedBird extends BirdEnhance {
private final int DISTANCE = 10;
EnhancedBird(Bird bird){
super(bird);
}
public int fly(){
int distance = 0;
distance = bird.fly()+eleFly();
return distance;
}
private int eleFly(){
return DISTANCE;
}
}
- Application.java
public class Application {
public static void main(String[] args){
//make normal bird
Bird bird1 = new NormalBird();
System.out.println(bird1.fly());
//make bird which can fly 60km.
BirdEnhance enhanceBird = new EnhancedBird(bird1);
System.out.println(enhanceBird.fly());
//make bird which can fly 70km.
BirdEnhance enhancedBird = new EnhancedBird(enhanceBird);
System.out.println(enhancedBird.fly());
}
}
装饰器模式的特点/优点
装饰器类同时继承并引用抽象组件,可以同时存放装饰者与被装饰者的引用。
同时由于可以引用被装饰者的实例,所以无需重写原来的装饰方法。类似于写了一个工具方法。
可以完成类似于迭代调用的功能。