`

设计模式—装饰者模式

 
阅读更多

通过继承实现子类的行为是在编译时静态决定的,而且所有子类都会继承到相同的行为;而组合可以在运行时动态的进行扩展,所以应该尽量利用组合的方法扩展对象的行为。运行时的扩展远比编译时期的继承威力大

    1  装饰者和被装饰者必须是一样的类型,即具有共同的超类。
    2  当我们将装饰者与组件组合时,就是在加入新的行为。
    3  java I/O中使用了大量的装饰类
    4  装饰者模式符合开放——关闭模式:允许扩展,但是不允许修改代码。


//超类
package com.quding.mode;

public abstract class Beverage {
	private String description = "unknown description";
	
	public String getDescription(){
		return description;
	}
	
	public abstract double cost();
}
//装饰者超类
package com.quding.mode;

public abstract class Decorator extends Beverage{

	public abstract String getDescription();
}


//具体的子类:

package com.quding.mode;

public class Coffee1 extends Beverage{

	@Override
	public double cost() {
		return 2.0;    //coffee1 价格2元
	}

	@Override
	public String getDescription() {
		return "coffee1";
	}
}


//子类2
package com.quding.mode;

public class Coffee2 extends Beverage{

	@Override
	public double cost() {
		return 4.0;    //coffee2 价格4元
	}

	@Override
	public String getDescription() {
		return "coffee2";
	}
}

 装饰者子类:

package com.quding.mode;

public class MilkDecorator extends Decorator {

	private Beverage mBeverage;

	public MilkDecorator(Beverage mBeverage) {
		super();
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		return mBeverage.getDescription() + " , milk";
	}

	@Override
	public double cost() {
		return mBeverage.cost() + 1;   //加牛奶一元
	}
}


//子类2
package com.quding.mode;

public class SugarDecorator extends Decorator {

	private Beverage mBeverage;

	public SugarDecorator(Beverage mBeverage) {
		super();
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		return mBeverage.getDescription() + " , sugar";
	}

	@Override
	public double cost() {
		return mBeverage.cost() + 2;   //加糖二元
	}
}

 测试代码:

package com.quding.mode;

public class MainTest {
	public static void main(String[] args) {
		System.out.println("要一份加糖的种类为coffee1的咖啡:");
		Beverage beverage = new SugarDecorator(new Coffee1());
		System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "
				+ beverage.cost());

		System.out.println("要一份加糖加两份牛奶的种类为coffee2的咖啡:");
		beverage = new SugarDecorator(new MilkDecorator(new MilkDecorator(
				new Coffee2())));
		System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "
				+ beverage.cost());
	}
}

 

总结:以上简单的几个类体现了装饰者模式的精髓。以后当使用继承时要考虑能否使用装饰者代替,扩展代码的弹性。

0
0
分享到:
评论

相关推荐

    设计模式 装饰者模式

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式是通过将对象包装在一个装饰器类中来实现的,装饰器类拥有与被装饰对象相同的接口,使得客户端代码可以...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    设计模式装饰者模式

    装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责或行为,而无需修改原有代码。这种模式的核心思想是将装饰功能和对象本身分离,使得装饰过程可以独立进行,...

    云南大学设计模式装饰者模式

    在云南大学设计模式的课程中,装饰者模式被应用到了一个米线店结账小程序的案例中。这个案例旨在帮助学习者更好地理解和运用装饰者模式。在这个场景下,我们可以将米线视为原始对象,而不同的配料如辣椒、酸菜等可以...

    java设计模式之装饰者模式代码

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展对象的功能,为对象提供新的行为,同时保持了代码的可读性和可维护...

    设计模式之装饰者模式,内含可运行代码

    总的来说,装饰者模式是一种强大的设计模式,它提供了一种在运行时动态调整对象行为的方法,使得代码更具灵活性和可扩展性。通过理解和熟练运用装饰者模式,我们可以更好地应对软件需求的变化,提高代码的可维护性和...

    设计模式的装饰者模式的例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们可以在不改变对象原有结构的情况下,通过...

    设计模式-装饰者模式

    在“设计模式—装饰者模式”中,我们将深入探讨这个模式的概念、实现方式以及实际应用。 装饰者模式的核心概念在于“装饰”(Decorator)和“组件”(Component)。组件是被装饰的基本对象,它可以是接口或者抽象类...

    54-Spring设计模式之装饰器模式1

    Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...

    c# ,设计模式,装饰者模式,星巴兹咖啡

    装饰者模式是面向对象设计模式中的一个重要概念,它在C#等编程语言中广泛应用。这个例子以星巴克咖啡为例,展示了如何使用装饰者模式来灵活地扩展对象的功能,而无需修改原有代码。 装饰者模式的核心思想是动态地将...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    Qt设计模式之装饰者模式

    **Qt设计模式之装饰者模式** 装饰者模式(Decorator Pattern)是软件设计模式中的结构型模式之一,它允许在运行时动态地给一个对象添加新的行为或职责,而无需修改对象本身。在Qt库中,装饰者模式也被广泛应用,...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    软件设计模式—装饰者模式

    装饰者模式是面向对象设计中的一种行为模式,它允许在运行时给对象添加新的行为或职责,而无需改变其原始类。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展其功能,装饰类与被装饰类具有相同的接口,因此...

    Java设计模式-装饰者模式

    本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》

    C++种设计模式 装饰模式.rar

    C++23种设计模式之 装饰模式。:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的...

    软件设计模式之装饰模式讲解

    软件设计模式之装饰模式讲解ppt,可用于教学课件。

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    设计模式之装饰者模式-极客学院

    装饰者模式是面向对象设计中的一种结构型模式,它的主要目的是动态地给一个对象添加一些额外的职责,即增加功能,同时又不破坏原有的结构。装饰者模式是一种比继承更灵活的扩展对象行为的方式,它避免了类爆炸问题,...

Global site tag (gtag.js) - Google Analytics