Decorator Pattern
问题
我开了一家蛋糕店,蛋糕最普通的是面包奶油蛋糕(MilkCake),你可以根据自己的喜好,在这个普通的蛋糕上添加你喜欢的一些装饰,我们提供的有:
草莓:Strawberry=$8
巧克力:Chocolate=$11
苹果:Apple=$5
橘子:Orange=$3
....
普通蛋糕:$100
现在我需要做一个草莓巧克力蛋糕,需要多少钱?
方案一
//MilkCake类 package com.pattern.decorator; public class MilkCake { private float milkCake=100; public float cost(){ return milkCake; } }
//StrawberryChocolateCake package com.pattern.decorator; public class StrawberryChocolateCake extends MilkCake{ private float strawberry=8;//草莓价格 private float chocolate=11;//巧克力的价格 @Override public float cost() { return super.cost()+strawberry+chocolate;//加上草莓巧克力后的蛋糕的价格 } }
//Test package com.pattern.decorator; public class Test { public static void main(String[] args) { StrawberryChocolateCake strawberryChocolateCake=new StrawberryChocolateCake(); float money=strawberryChocolateCake.cost(); System.out.println(money); } }
问题
有人想要一个巧克力奶油蛋糕,我需要改源码
草莓价格改了,我还需要改源码
...
这样的话,太折腾人了
问题的解决
装饰者模式
动态的将责任附加到对象上,如要扩展,装饰者提供了比继承更有弹性的替代方案
方案二
package com.pattern.decorator1; public interface Cake { public abstract float cost(); }
package com.pattern.decorator1; /** * 基本的蛋糕-牛奶蛋糕-100元哟! */ public class MilkCake implements Cake{ private float milkCake=100; @Override public float cost() { return milkCake; } }
package com.pattern.decorator1; /** * 蛋糕装饰者,如果你是装饰者,你就需要继承此类方能给蛋糕装饰 */ public abstract class CakeDecorator implements Cake{ }
package com.pattern.decorator1; /** * 草莓蛋糕是装饰普通蛋糕的,继承CakeDecorator */ public class StrawberryCake extends CakeDecorator{ private Cake cake;//标识装饰给那一块蛋糕的 private float strawberry=8;//草莓的价格 public StrawberryCake(){ } /** * 如果需要草莓来装饰蛋糕,就把你的蛋糕放进来吧!!! */ public StrawberryCake(Cake cake){ this.cake=cake; } /** * 算出草莓装饰后的蛋糕的总价 */ @Override public float cost() { return cake.cost()+strawberry; } }
package com.pattern.decorator1; /** * 巧克力蛋糕是装饰普通蛋糕的,继承CakeDecorator */ public class ChocolateCake extends CakeDecorator{ private Cake cake;//标识装饰给那一块蛋糕的 private float chocolate=11;//巧克力的价格 public ChocolateCake(){ } /** * 如果需要巧克力来装饰蛋糕,就把你的蛋糕放进来吧!!! */ public ChocolateCake(Cake cake){ this.cake=cake; } /** * 算出草莓装饰后的蛋糕的总价 */ @Override public float cost() { return cake.cost()+chocolate; } }
package com.pattern.decorator1; public class Test { public static void main(String[] args) { MilkCake cake=new MilkCake(); float money1=cake.cost(); System.out.println(money1);//普通蛋糕100 StrawberryCake strawberryCake=new StrawberryCake(cake); float money2=strawberryCake.cost(); System.out.println(money2);//草莓蛋糕108 ChocolateCake chocolateCake=new ChocolateCake(strawberryCake); float money3=chocolateCake.cost(); System.out.println(money3);//巧克力草莓蛋糕119 } }
Java.io中的装饰者模式
相关推荐
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。 3. **行为型模式**(Behavioral Patterns):...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
在"03_DecoratorPattern 小菜扮靓"这个主题中,我们可以推断作者可能以轻松幽默的方式介绍了装饰器模式的概念。"小菜"可能是用来比喻待装饰的对象,"扮靓"则表示通过装饰增强其功能或特性。博文链接指向了iteye博客...
在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...
装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责,而不必修改原有代码,遵循“开闭原则”。在Java中,装饰者模式通常通过继承和组合来实现,尤其适用于那些...
13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不修改已有对象的代码情况下,通过增加额外的行为来扩展对象的功能。这种模式的核心在于装饰类与被装饰类具有相同的接口,这样客户端可以像处理原始对象...
Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的...
装饰者模式是一种设计模式,属于结构型模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包裹在一个装饰类中来扩展其功能。在...
装饰者模式(Decorator Pattern)是一种设计模式,它允许在运行时动态地给对象添加新的行为或职责,而不会改变对象的类。这种模式是结构型模式的一种,通过将对象包装在一个装饰器对象中来实现扩展功能,使得原有...
3.8 装饰器模式(Decorator Pattern) 装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 4...
装饰者模式(Decorator Pattern)是软件工程中一种用于动态地给对象添加职责的设计模式。它允许我们独立于对象的类来扩展对象的功能,无需修改原有代码就能增加新功能,遵循“开闭原则”。这种模式是一种结构型设计...
装饰模式(Decorator Pattern)是一种结构型设计模式,它可以在不修改原有对象的基础上,通过添加新的职责来扩展对象的功能。装饰模式的核心在于它定义了一个与原类一致的接口,使得装饰类和原类可以互相替换,而...
装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command ...
在Java或C#等面向对象语言中,装饰者模式通常涉及到四个关键角色:抽象组件(Component)、具体组件(Concrete Component)、装饰器(Decorator)和具体装饰者(Concrete Decorator)。下面将详细介绍这些角色以及...
【Java装饰模式(Decorator Pattern)】装饰模式是一种结构型设计模式,它允许在不修改已有对象的基础上,通过添加额外的功能来扩展对象的行为。这种模式的关键在于装饰类与被装饰类有相同的接口,使得它们可以互换...
8. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。例如,`java.io.BufferedInputStream`和`java.io.BufferedOutputStream`为原始的输入/输出流提供了装饰功能。 9. 外观模式(Facade ...
树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...
7. **装饰器模式(Decorator Pattern)**:动态地给一个对象添加一些额外的职责,提供了比继承更灵活的扩展对象功能的方式。 8. **代理模式(Proxy Pattern)**:为其他对象提供一种代理以控制对这个对象的访问,...