装饰模式属于结构模式,结构中包含抽象组件、具体组件、装饰和具体装饰4种角色。
- 抽象组件(Component):抽象组件(抽象类)定义了需要进行装饰的方法。抽象组件就是“被装饰者”角色。
- 具体组件(ConcereteComponet):具体组件是抽象组件的一个子类。
- 装饰(Decorator):该角色是抽象组件的一个子类,是“装饰者”的角色,其作用是装饰具体组件(装饰被修饰者)
- 具体装饰(ConcreteDecotator):具体装饰是“装饰”角色的一个非抽象子类。
以给麻雀装机械翅膀为例子:
Bird.java
//定义鸟这个抽象类(即抽象组件)
public abstract class Bird {
public abstract int fly();
}
Sparrow.java
//定义麻雀类集成鸟类(即具体组件)
public class Sparrow extends Bird {
//普通麻雀飞行距离为100
public final int Instance = 100;
public int fly() {
return Instance;
}
}
Decorator.java
//装饰(是抽象组件的一个子类)
public abstract class Decorator extends Bird{
Bird bird;
public Decorator(){
}
//对被装饰者的引用
public Decorator(Bird bird) {
this.bird = bird;
}
public abstract int eleFly();
}
SparrowDecorator.java
//装饰类的具体实现
public class SparrowDecorator extends Decorator {
public final int DISTANCE = 50;
SparrowDecorator(Bird bird){
//super是指向父类的一个指针
super(bird);
}
public int eleFly() {
return DISTANCE;
}
public int fly() {
int distance = 0;
distance = bird.fly()+eleFly();
return distance;
}
}
Application.java
//应用
public class Application {
public static void main(String[] args) {
Bird bird = new Sparrow();
System.out.println("普通鸟的飞行距离"+bird.fly());
bird = new SparrowDecorator(bird);
System.out.println("装了一个机械翅膀的距离"+bird.fly());
bird = new SparrowDecorator(bird);
System.out.println("装了两个机械翅膀的距离"+bird.fly());
}
}
结果如下: