`

装饰者模式(Decorator Pattern)_Java

阅读更多

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中的装饰者模式



 

  • 大小: 133.1 KB
  • 大小: 333.2 KB
分享到:
评论

相关推荐

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。 3. **行为型模式**(Behavioral Patterns):...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    03_DecoratorPattern 小菜扮靓

    在"03_DecoratorPattern 小菜扮靓"这个主题中,我们可以推断作者可能以轻松幽默的方式介绍了装饰器模式的概念。"小菜"可能是用来比喻待装饰的对象,"扮靓"则表示通过装饰增强其功能或特性。博文链接指向了iteye博客...

    DecoratorPattern.rar

    在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...

    java装饰者模式实现

    装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责,而不必修改原有代码,遵循“开闭原则”。在Java中,装饰者模式通常通过继承和组合来实现,尤其适用于那些...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...

    java 装饰模式(Decorator Pattern)详解

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不修改已有对象的代码情况下,通过增加额外的行为来扩展对象的功能。这种模式的核心在于装饰类与被装饰类具有相同的接口,这样客户端可以像处理原始对象...

    java实现装饰器模式(Decorator Pattern)

    Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的...

    Decorator pattern

    装饰者模式是一种设计模式,属于结构型模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包裹在一个装饰类中来扩展其功能。在...

    装饰者模式Demo

    装饰者模式(Decorator Pattern)是一种设计模式,它允许在运行时动态地给对象添加新的行为或职责,而不会改变对象的类。这种模式是结构型模式的一种,通过将对象包装在一个装饰器对象中来实现扩展功能,使得原有...

    liang-faan_JavaDesignPattern.pdf

    3.8 装饰器模式(Decorator Pattern) 装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 4...

    DecoratorPattern.zip

    装饰者模式(Decorator Pattern)是软件工程中一种用于动态地给对象添加职责的设计模式。它允许我们独立于对象的类来扩展对象的功能,无需修改原有代码就能增加新功能,遵循“开闭原则”。这种模式是一种结构型设计...

    java 装饰模式(Decorator Pattern)详解及实例代码

    装饰模式(Decorator Pattern)是一种结构型设计模式,它可以在不修改原有对象的基础上,通过添加新的职责来扩展对象的功能。装饰模式的核心在于它定义了一个与原类一致的接口,使得装饰类和原类可以互相替换,而...

    用Java实现23种设计模式

    装饰器模式(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)

    【Java装饰模式(Decorator Pattern)】装饰模式是一种结构型设计模式,它允许在不修改已有对象的基础上,通过添加额外的功能来扩展对象的行为。这种模式的关键在于装饰类与被装饰类有相同的接口,使得它们可以互换...

    设计模式_java语言中的应用

    8. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。例如,`java.io.BufferedInputStream`和`java.io.BufferedOutputStream`为原始的输入/输出流提供了装饰功能。 9. 外观模式(Facade ...

    design-pattern-java.pdf

    树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    7. **装饰器模式(Decorator Pattern)**:动态地给一个对象添加一些额外的职责,提供了比继承更灵活的扩展对象功能的方式。 8. **代理模式(Proxy Pattern)**:为其他对象提供一种代理以控制对这个对象的访问,...

Global site tag (gtag.js) - Google Analytics