Java设计模式之Decorator模式


感觉比之前理解深了一点,红字为新理解的内容,小白看过来
首先,不抽象,举个例子。
     我要去喝咖啡,咖啡店里有两种咖啡,一种摩卡的,一种蓝山的,摩卡的50块,蓝山的100块。
     买了咖啡后还能放配料,有牛奶和伴侣。牛奶10块一包,伴侣高级一 点,15块一包。
     现在店里新上货一种配料方糖,5块钱一包,现在把上述的情景想象成已有代码,那么怎么才能在不改变源代码的情况下加入方糖这种新配料呢?

现在再附上类图与代码(类图代码转至 博客园“IT职涯”博主)






总结
   
     1.装饰设计模式的好处在于拥有新装饰(功能时)不用改变原有代码,只需要添加新的装饰效果(装饰类)就能完成。
     2.该模式中将Drink的子类(除了Decorator)的对象a作为实参传入装饰类的对象b的构造方法中,相当于对a添加了b装饰。
     3.装饰效果可以叠加,比如我先加了牛奶,我还可以再加方糖,加方糖时只需要将前者已经加入了牛奶的咖啡作为实参传递到方糖装饰类的对象的构造方法即可(结果第一行)。
     4.装饰设计必须得有一个底层对象,所有的方法都是增强底层对象,以底层对象实现的内容为基础再添油加醋的方法
           FileInputStream是一个节点流,它需要依赖于一个固定的东西,比如硬盘上一个文件
           BufferedInputStream就是一个装饰流,因为必须要先给它一个底层对象,对该对象起到装饰增强作用
       5.最重要一点:是你还有你,一切拜托你
        去装饰 Drink类,本身还是Drink类,而且内部还有一个Drink成员,该装饰可以把想要重写的Drink的方法重写,也可以直接就用Drink自身的实现,好处在于不管你传进来的是Drink类下的哪一种子类,我都能给你修饰,而普通继承实现就需要构造大量子类,过于繁琐死板
注意
     1..主函数中定义主体对象(此例中当做咖啡)与装饰对象时都应添加final修饰符,(final关键字,父类中被final定义的成员变量子类中不可被改写,但可通过super调用父类方法改写,此处不对final做过多解释),因为对象可能需要进行多种装饰,而非仅仅一种。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值