装饰者设计模式(Decorator)
装饰者设计模式你也可以称之为装饰器设计模式,反正你想叫啥叫啥,我这里习惯叫装饰者了。
有同学估计已经学的累了,心想,这个sb博主,怎么唠唠叨叨的还没写完呢,大家稍安勿躁,我都是讲解的精品设计模式,大家稍微有点耐心,学习不是一蹴而就的事情,大家共勉!
这里的装饰者模式就非常有意思了!这里我还是举个例子说明这个设计模式:
这样,大家都知道孙悟空吧,会七十二般变化,还能翻个跟头就十万八千里,假如今天孙悟空想变成条鱼,你说这条鱼能飞行十万八千里吗?当然可以,这里鱼只是外壳,实际上里面还是孙悟空,对吧,那你说假如让你用代码描述这件事情,你怎么说?鱼继承了孙悟空?明显不行,因为两个东西是两个物种,但是你说鱼能不能十万八千里,好像也还行,是不是这个问题就比较贱,比较棘手,但是这里我们使用装饰者模式就可以完美的解决这个问题。
咱们慢慢梳理一下这个问题,首先我问大伙,孙悟空能十万八千里,变成鱼也能吧,这里我们就提取一个共同点,就是这个Move类,没毛病吧老铁:
public interface Move {
void fly();
}
然后主角登场了:
public class MonkeyKing implements Move{
@Overridepublic void fly() {
System.out.println("孙悟空飞了十万八千里");}
}
主角孙悟空实现了并重写了Move接口,那么问题来了,鱼怎么写?继承孙悟空?绝对不行,这里就用到了装饰者模式,首先我们来看看代码怎么写:
public class Decorator implements Move{
private MonkeyKing mk;public Decorator(MonkeyKing mk){
this.mk = mk;}@Overridepublic void fly() {
System.out.println("孙悟空变成鱼,飞了十万八千里");}
}
这个就是装饰者模式,实现重写了Move接口,相当于一个壳子,里面有孙悟空飞十万八千里的功能,接下来我详细解释一下这个代码:首先大家明白,这个只是一个壳子,外壳是一只鱼,内核实际上是孙悟空,所以我们需要在这个类里面实例化出来这个孙悟空,并且写一个孙悟空的有参构造函数,到时候传进来是只鱼,你也是孙悟空,传进来是个屎壳郎,你也是孙悟空,你也能飞。
这里相当于把装饰者模式(就是一个特殊类)当成一个桥,把孙悟空接进来,放到这个伪装的壳里面去
然后我们看看鱼这个类怎么写:
public class Fish extends Decorator{
public Fish(MonkeyKing mk){
super(mk);}
}
鱼继承了装饰者,书写了一个构造函数,super调用父类方法,实现能飞的愿望。
大体就算完成了,我们主函数调用一下看一眼:
public class TestCase {
public static void main(String[] args) {
MonkeyKing mk = new MonkeyKing();mk.fly();Fish fish = new Fish(mk);fish.fly();}
}
主函数先实例化了一个孙悟空,一运行,能飞。
然后实例化一个鱼,把孙悟空这个实例传进去,一运行,神了!也能飞,这也许是最牛X的鱼了吧。
好了,装饰者模式大致也就是这样了。大家听懂了吗~