装饰者模式

运行时扩展,远比编译时期的继承威力大

用对象组合的方式,做到运行时装饰类


1.      有四种饮料Beverage,分别是HouseBlendDarkRoastDecafEspresso,要求在其中加入各种调料,Streamed MilkSoyMochaWhipandSoy

——类爆炸,每个cost方法计算出咖啡单上各种调料的价钱

——从基类下手,加上实例变量代表是否加上调料


调料价格改变会修改现有代码

出现新的调料,需要加上新的方法,并改变超类的cost方法

要双倍的摩卡咖啡,怎么办?

有些饮料不要调料


2.      装饰模式

设计原则:类应该对扩展开放,对修改关闭

——拿一个DrakRoast对象,以摩卡对象装饰它,以奶泡对象装饰它,调用cost方法,并依赖委托将调料的价格加上去

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。

装饰者和被装饰着对象有相同的超类型;可以用一个或者多个装饰者包装一个对象;

任何需要原始对象的场合都可以用装饰过的对象代替它;

装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。


Component 每个组件可以单独使用,或者被装饰着包起来使用;

Decorator,每个装饰者都“有一个”组件;用这个实例变量保存某个Component的引用

ConcreteDecoratorA,装饰者可以加上新方法,新行为通过在旧行为前或后做一些计算来添加

ConcreComponent,动态地加上新行为的对象

原以为:这个模式中不会使用继承,而是利用组合取代继承

装饰者和被装饰者必须是一样的类型,共同的超类,利用继承达到“类型匹配”,而不是为了继承获得“行为”,新行为是由组合对象得到的。

如果依赖继承,类的行为只能在编译时静态决定;利用组合,在“运行时”混合着用


3.      真实世界的装饰者:Java I/O

InputStream in = new LineNumberInputStream(new BufferedInputStream(new FileInputStream("test.txt")));





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值