装饰器(设计模式)

既不改变原有的类,也不直接继承原有的类,却能给原有的类加上新的功能,是装饰器模式所要实现的。

我有一辆死飞自行车,我希望不改变自行车的内部结构,也能让它拥有夜间照明系统,该怎么做呢?最好的做法是,直接自行车的车把上“装”一个强力的手电筒。(也可以再加上一些控制电路,与手机连通,之后就可以通过APP来控制死飞的照明系统了哦,所谓的车联网不过如此嘛-_-)

上面的“装”就是“装饰器”的意思,给死飞装饰一个手电筒,死飞不就有前大灯了嘛。

装饰器模式的原理,就如上面死飞的例子,若换到代码中,也是差不多的。

首先有个待装饰的类(Bike),它实现了IBike接口。

1
2
3
4
5
6
7
8
9
public interface IBike {
void run();
}

public class Bike implements IBike {
run() {
System.out.println("原装死飞并没有照明系统");
}
}

之后有个装饰器类(AddLight),它的内部以IBike的形式保存了待装饰类Bike,也实现了Bike的所有函数(每个函数中,AddLight除了调用Bike的同名函数外,也添加了额外的代码,也就是额外装饰上去的内容)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public class AddLight implements IBike {

IBike iBike;

public AddLight(IBike iBike) {
super();
this.iBike = iBike;
}

@Override
public void run() {
System.out.println("在装饰器里,死飞被装饰上了车头激光大灯");
iBike.run();
System.out.println("在装饰器里,死飞被装饰上了车头激光大灯");
}

}

什么时候我们想要一辆有前灯的死飞,就将它托管给装饰器,装饰器自动地给我们装饰好带激光大灯的死飞了。