不一样解释的装饰者模式

       先说一下为什么写这篇文章,因为装饰者模式有很多了,为什么还要重复地写呢?写它主要是因为它不一样,不一样在对定义的解释,与见解。这里建议你已经知道装饰者的基本写法了。

首先看一下维基百科对装饰者的解释:通过使用修饰模式,可以在运行时扩充一个类的功能。

原理是:

  1. 增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。
  2. 装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。
  3. 修饰类必须和原来的类有相同的接口。
  4. 修饰模式是类继承的另外一种选择。

         一般对于定义的东西,都是很抽象,除非你真的懂装饰者模式,否则,读一遍,就是云里雾里。我这里就是要更通俗地解释一下它。

        什么叫运行时扩展一个类的功能,就是在一个类的功能随着代码的运行可以增加。不清楚?往下看,这个增加很重要!!!

先看装饰者的类图


所谓对一个类的功能增加,那么它有两个方面:

  • 1.继承父类的方法,在父类方法上重写,扩增。
  • 2.加入新的方法,进行功能的扩增。

就比如说ConcreteDecoratorA,在重写父类MethodA的时候,可以增加一些代码,来添加功能,也可以有一个新的newBehavior()

我要讲的重点:区别就在这里! new ConcreteDecoratorB(new ConcreteDecoratorA(new Component()))

    1.解释动态:我们可以new Componet 对象做一些事情,之后想增加功能,我们再new ConcreteDecoratorA()包裹它。再做一点功能,ok,入门者都清晰的想法。又doSomething之后,我们又想增加功能,然后new ConcreteDecoratorB再增加。这就是动态增加功能!

    2.关键在:是我们在使用ConcreteDecoratorB的时候还能用之前,ConcreteDecoratorA包裹Component时,newBehavior方法吗?显然是不能的,因为实体已经是B了,不可能调用到A的方法。

总结:所以修饰者模式,有两种穿衣服的方法:

1.在装饰者继承父类方法上加功能,就好像穿了一件秋衣,再穿毛衣,再穿羽绒服,好了,可以过冬了。

2.装饰者子类上新增方法像newBehavior(),这个时候就想穿了一件蓝毛衣,过个秋天,等冬天到了,穿羽绒服,毛衣也脱掉了。我认为这也是装饰者所在的不足。

为什么说 修饰模式是类继承的另外一种选择。

比如,现在有一个饮料类(Beverage),向饮料中添加不同的配料(蒸奶(Steamed Milk)、豆浆(Soy)、
摩卡(Mocha,也就是巧克力风味)或覆盖奶泡),就会配制出很多种不同的种类的饮料,其价格也随着添加的配料而变化,饮料店需要计算价格,如果用具体子类继承饮料类并考虑到所有组合的话,将是一个“类爆炸”



想这样你就想用装饰者模式了

参考文章慕课简书










    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值