使用对象组合的方式(被装饰者组合到装饰者里面),做到在运行时装饰类。
去数码城配电脑,除了买电脑,还需要配置很多配件。
Computer是一个抽象类,cost()方法是抽象的(因为每个电脑的价格都不一样),子类必须定义自己的实现。
个人电脑:Thinkpad,Acer, Sony等
电脑配件,如:MemoryBank,CD,Audio。根据所加的配件不同,最后买单的价格也不同。
第一种实现方式,我们为每种个人电脑和每种配件排列组合,生成笛卡尔积个数的类,调用对应的类的cost()方法,就可以直接得到最后买单的价格。
这种方式的缺点就是类太多,每次新增一个配件,就需要创建很多类。
下面用装饰者模式来实现:装饰者和被装饰者类型必须一致。(配件和个人电脑必须拥有相同的超类)
计算机为主体,然后在运行时,用配件来“装饰”个人电脑,比如个人电脑想增配一条内存条。
1、用户选了台thinkpad
Thinkpad继承自Computer,并且有一个计算价格的cost()方法。
2、用户增配了根内存
MemoryBank是个装饰者,它的类型“反映”了它所装饰的对象。所谓反映,就是两者类型一致。
所以MemoryBank也有一个计算价格的cost()方法。
通过多态,也可以把MemoryBank所包裹的任何Computer当成是Computer。
3、还想配个音响
Audio是个装饰者,并用它将MemoryBank对象包装起来。
4、买单的时候,通过调用最外面的装饰者(Audio)的cost()方法就可以了。
Audio会先委托它装饰的对象(MemoryBank)计算出价格,然后再加在音响的价格。
可以用一个或多个装饰者包装一个对象。
因为装饰者和被装饰者有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
装饰者可以在所委托的被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
运行时动态地、不限量的用你喜欢的装饰者来装饰对象。
装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
每个装饰者都有一个组件,也就是说,装饰者有一个实例变量以保存某个被装饰者的引用。
package com.ez.component; import com.ez.Computer; import com.ez.decorator.Audio; import com.ez.decorator.MemoryBank; /** * 装饰者模式,通过装饰者,动态算出清单价格。 * @author 窗外赏雪(EZ编程网) */ public class DecoratorTest { public static void main(String[] args) { Computer thinkpad=new Thinkpad(); System.out.println(thinkpad.getDescription()+" ¥"+thinkpad.cost()); Computer acer=new Acer(); acer=new Audio(acer); acer=new MemoryBank(acer); System.out.println(acer.getDescription()+" ¥"+acer.cost()); } }
package com.ez; /** * 电脑 * @author 窗外赏雪 */ public abstract class Computer { public String description="电脑"; public String getDescription() { return description; } public abstract double cost(); }
package com.ez.component; import com.ez.Computer; /** * 宏基电脑 * @author 窗外赏雪(EZ编程网) */ public class Acer extends Computer{ public Acer() { description="宏基电脑"; } @Override public double cost() { return 2500; } }
package com.ez.component; import com.ez.Computer; /** * thinkpad电脑 * @author 窗外赏雪(EZ编程网) */ public class Thinkpad extends Computer{ public Thinkpad() { description="thinkpad"; } @Override public double cost() { return 3500; } }
package com.ez; /** * 电脑配件装饰者 * @author 窗外赏雪(EZ编程网) * */ public abstract class ComputerPartsDecorator extends Computer{ /** * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。 * 需要重新实现方法,不能直接继承,因为要加自己的行为。 */ public abstract String getDescription(); }
package com.ez.decorator; import com.ez.Computer; import com.ez.ComputerPartsDecorator; /** * 音响:继承电脑配件装饰者,价格为100。 * 通过构造方法来装饰电脑,通过组合被装饰者,实现装饰者模式。 * 装饰者和被装饰者类型必须一致。 * @author 窗外赏雪(EZ编程网) */ public class Audio extends ComputerPartsDecorator{ Computer computer; public Audio(Computer computer) { this.computer=computer; } /** * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。 */ @Override public String getDescription() { return computer.getDescription()+" +Audio"; } /** * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。 */ @Override public double cost() { return 100+computer.cost(); } }
package com.ez.decorator; import com.ez.Computer; import com.ez.ComputerPartsDecorator; /** * 内存条:继承电脑配件装饰者,价格为200。 * 通过构造方法来装饰电脑,通过组合被装饰者,实现装饰者模式。 * 装饰者和被装饰者类型必须一致。 * @author 窗外赏雪(EZ编程网) */ public class MemoryBank extends ComputerPartsDecorator{ Computer computer; public MemoryBank(Computer computer) { this.computer=computer; } @Override public String getDescription() { return computer.getDescription()+" +MemoryBank"; } @Override public double cost() { return 200+computer.cost(); } }
相关推荐
设计模式--装饰者模式java例子
装饰者模式Demo
装饰者模式 C++ 实现
设计模式 - 装饰者模式
装饰者模式代码demo 装饰者模式代码demo 装饰者模式代码demo
c# ,设计模式,装饰者模式,星巴兹咖啡,基本上就是head first 上的例子的C#实现,根据自己的理解,作了一点点改动,可以直接运行。
装饰者模式的典型应用。 装饰者模式的典型应用。 装饰者模式的典型应用。
Qt设计模式之装饰者模式
设计模式的装饰者模式的例子,希望对大家有用~~~~~~~~
装饰者模式demo
java装饰者模式实现,通过豆浆,加糖加鸡蛋加黑豆生动的实现了装饰着的代码,可以学习,也可以在此基础上进行扩充
装饰者模式学习案例代码 文章:http://blog.csdn.net/hailushijie/article/details/8630106
Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现 VS2012 下通过
设计模式中的装饰模式,AndroidStudio工程
java设计模式【之】装饰者模式【源码】【场景:煎饼果子+肠+蛋】 * 测试类【之】煎饼果子来一套 * * 不改变原有对象的基础上,强化已经存在的功能 * 被装饰者与装饰者实现同一个抽象或接口 * 装饰后,最终还是...
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型...一旦你熟悉了装饰者的技巧,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。——《Head First 设计模式》
装饰者模式结合模板方法模式实现奶茶商店:原来的奶茶商店需要引进咖啡,用装饰者模式结合模板方法模式
java设计模式之装饰者模式代码