既不改变原有的类,也不直接继承原有的类,却能给原有的类加上新的功能,是装饰器模式所要实现的。
我有一辆死飞自行车,我希望不改变自行车的内部结构,也能让它拥有夜间照明系统,该怎么做呢?最好的做法是,直接自行车的车把上“装”一个强力的手电筒。(也可以再加上一些控制电路,与手机连通,之后就可以通过APP来控制死飞的照明系统了哦,所谓的车联网不过如此嘛-_-)
上面的“装”就是“装饰器”的意思,给死飞装饰一个手电筒,死飞不就有前大灯了嘛。
装饰器模式的原理,就如上面死飞的例子,若换到代码中,也是差不多的。
首先有个待装饰的类(Bike),它实现了IBike接口。
1 | public interface IBike { |
之后有个装饰器类(AddLight),它的内部以IBike的形式保存了待装饰类Bike,也实现了Bike的所有函数(每个函数中,AddLight除了调用Bike的同名函数外,也添加了额外的代码,也就是额外装饰上去的内容)
1 |
|
什么时候我们想要一辆有前灯的死飞,就将它托管给装饰器,装饰器自动地给我们装饰好带激光大灯的死飞了。