`

装饰者模式(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):...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式的特点 3. 装饰器模式的UML类图和基本结构 3.1 UML...

    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 扩展系统功能——装饰模式(一) 扩展系统...

Global site tag (gtag.js) - Google Analytics