`
hm4123660
  • 浏览: 281575 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:69716
社区版块
存档分类
最新评论
阅读更多

       装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象.以下情况使用Decorator模式

1. 需要扩展一个类的功能,或给一个类添加附加职责。

2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 

   看了上面文字性的叙述头都晕了,下面以实例来讲解。我们都知道买奶茶可以添加各种配料,如下



 

      这里只有了4种配料即可生成那么多种奶茶,如果我们用一个奶茶子类来存储该种奶茶的价格(价格为奶茶原价加上添加各个配料的前的和)和名称,则会派生出很多对应的子类,如果再为奶茶添加巧克力,布丁等配料,则又会添加许多子类,可以想象,每增加一种配料,对应的子类会增加很多。会导致类爆炸,也不好管理对应的子类。这里就可以使用装饰者模式来解决该问题。

 

1.定义被装饰者的对象接口

package com.longpo.decorator;
/**
 * 被装饰者的对象接口
 *
 */
public interface Drink {

	//奶茶名字
	public String name();
	
	//奶茶价格
	public float price();
}

 

2.具体被装饰者的对象:奶茶

package com.longpo.decorator;
/**
 * 具体的被装饰者对象:奶茶
 *
 */
public class MikeTea implements Drink {

	@Override
	public String name() {
		return "奶茶";
	}

	@Override
	public float price() {
		return 1f;//奶茶原价1元
	}

}

 

3.定义装饰者的父类

package com.longpo.decorator;
/**
 *装饰者的父类
 */
public abstract class Decorator implements Drink{

	public Drink drink;//要装饰的对象
	
	public Decorator(Drink drink)
	{
		this.drink=drink;
	}
	
	@Override
	public String name() {
		return drink.name();
	}

	@Override
	public float price() {
		return drink.price();
	}

}

 4.定义装饰者类:即配料

配料1:椰果类

package com.longpo.decorator;
/**
 * 具体的装饰对象:椰果
 */
public class Coconut extends Decorator{

	public Coconut(Drink drink) {
		super(drink);
	}
	
	@Override
	public String name() {
		return "椰果"+super.name();
	}
	
	@Override
	public float price() {
		return super.price()+0.8f;//椰果8毛
	}

}

 

配料2:珍珠类

package com.longpo.decorator;

/**
 * 具体的装饰对象:珍珠
 */
public class Pearl extends Decorator{

	public Pearl(Drink drink) {
		super(drink);
	}

	@Override
	public String name() {
		return "珍珠"+super.name();
	}
	
	@Override
	public float price() {
		return super.price()+0.5f;//珍珠5毛
	}
}

 

配料3:果条类

package com.longpo.decorator;

/**
 * 具体的装饰对象:果条
 */
public class Fruit extends Decorator{

	public Fruit(Drink drink) {
		super(drink);
	}

	@Override
	public String name() {
		return "果条"+super.name();
	}
	
	@Override
	public float price() {
		return super.price()+0.5f;//果条5毛
	}
}

 

配料4:红豆

package com.longpo.decorator;

/**
 * 具体的装饰对象:红豆
 */
public class RedBean extends Decorator{

	public RedBean(Drink drink) {
		super(drink);
	}

	@Override
	public String name() {
		return "红豆"+super.name();
	}
	
	@Override
	public float price() {
		return super.price()+1f;//红豆1元
	}
}

 

这样我们就写好了装饰者模式了,下面来测试一下装饰者模式

package com.longpo.decorator;

public class DecoratorTest {

	public static void main(String[] args) {

		//首先弄杯奶茶
		Drink drink=new MikeTea();
		//奶茶里添加椰果
		Coconut coconut=new Coconut(drink);
		//再添加红豆
		RedBean redBean=new RedBean(coconut);
		
		System.out.println("第一杯奶茶为: "+redBean.name()+"  价格为: "+redBean.price());
		
		//再弄杯奶茶
		Drink drink1=new MikeTea();
		//奶茶里添加果条
		Fruit fruit=new Fruit(drink1);
		//再添加椰果
		Coconut coconut1=new Coconut(fruit);
		//再添加红豆
		RedBean redBean1=new RedBean(coconut1);
		//在添加珍珠
		Pearl pearl=new Pearl(redBean1);
		System.out.println("-----------------------------");
		System.out.println("第而杯奶茶为: "+pearl.name()+"  价格为: "+pearl.price());
	}

}

 

运行结果:




 
 

使用类装饰者模式,没添加一种配料我们主需要多添加一个配料的具体装饰者对象类就可以了。

 

     通过上面的实际例子,已经发现了装饰者模式的好用之处了。学习了解装饰者设计模式是很有必要的,最常用的java的IO就使用了装饰者模式。

  • 大小: 18.4 KB
  • 大小: 7.8 KB
  • 大小: 9.1 KB
4
0
分享到:
评论
3 楼 white_crucifix 2015-05-29  
这个例子还是有点怪。应当把所有Decorator的实现类的类名都加上MilkTea后缀。
2 楼 typa01_kk 2015-05-29  
很不错啊,觉的设计模式好有意思!
1 楼 u012256398 2015-05-28  
案例讲的很好,很好理解

相关推荐

    01.装饰者设计模式和动态代理设计模式.wmv

    01.装饰者设计模式和动态代理设计模式.wmv

    weekyuan#design-patterns#笔记五 装饰者设计模式1

    1. 装饰者设计模式-是什么 2. 装饰者设计模式-定义 3. 装饰者设计模式-模拟网关权限控制 4. 装饰者设计模式-测试

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

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

    装饰设计模式

    ### 装饰设计模式详解 #### 一、装饰设计模式概述 装饰设计模式(Decorator Pattern)是一种结构型设计模式,允许向对象动态地添加新功能。这种模式提供了一种替代继承的方式,使得我们可以在不修改原有类的基础上...

    设计模式-装饰者

    装饰者设计模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或属性,而无需修改对象的源代码。这种模式的核心在于装饰者和组件接口是相同的,因此装饰者可以完全替代原对象,同时还能增加额外的功能,...

    设计模式-装饰者模式

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

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

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

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

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

    24种设计模式以及混合设计模式

    创建型设计模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)和建造者模式(Builder)。这些模式提供了一种灵活且可扩展的方式来创建和管理对象。 结构型...

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

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

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式课件大全

    设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式...

    Head First 设计模式 +Java设计模式(第2版)

    这本书通过丰富的图像、故事和幽默的方式,引导读者了解23种经典的GoF(Gang of Four)设计模式,包括单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、代理模式等。书中强调了如何在实际项目中选择和应用...

    GOF设计模式中英文+设计模式精解中英文

    总之,GOF设计模式和设计模式精解是软件工程师的宝贵参考资料,无论你是初学者还是经验丰富的开发者,都应该熟悉和掌握这些模式,以便在项目中灵活运用,提高代码质量和可维护性。通过深入学习这些设计模式,不仅...

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

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

    Qt设计模式之装饰者模式

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

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

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

    设计模式—装饰者模式

    装饰者模式(Decorator Pattern)是软件工程中一种用于动态地给一个对象添加额外职责的设计模式。它属于结构型模式,可以让我们在不改变对象自身的基础上,在运行时为对象添加新的功能,即“装饰”对象。这使得我们...

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

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

Global site tag (gtag.js) - Google Analytics