`
liuxi1024
  • 浏览: 390232 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式--装饰者模式

阅读更多

1、概念描述

      该模式以对客户端透明的方式扩展对象的功能。

      装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
      装饰者和被装饰者必须是一样的类型,这是相当关键的地方。我们利用继承达到"类型匹配",而不是利用继承获得"行为"。装饰者和被装饰者需具有相同的"接口",使得装饰者能够取代被装饰者;他们的行为,是通过组件之间的组合得到的。

      涉及的角色:

      (1)抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。

      (2)具体构件角色:将要被附加功能的类,实现抽象构件角色接口。

      (3)抽象装饰者角色:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。

      (4)具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能。

     注意点:

     (1)装饰者和被装饰者必须具有相同的超类型。

     (2)装饰者即可以包装被装饰者,也可以包装装饰者。往往利用多层包装来达到目的。

     (3)装饰者中组合了被装饰者对象,这是装饰类的关键特征。正是由于这种组合,使得我们能够随心所欲的通过嵌套装饰来动态扩展行为。

 

2、实例

(1)、根据《Head First 设计模式》 装饰者模式应用到“星巴兹”咖啡店,类图如下



  (2)、主体coffee

public abstract class Coffee {
	String description = "Unknown Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

 (3)、被装饰者BrazilCoffee、JavaCoffee、Cappuccnio

public class BrazilCoffee extends Coffee {

	public BrazilCoffee(){
		description ="BrazilCoffee";
	}
	
	@Override
	public double cost() {
		return 1.99;
	}
}
 
public class JavaCoffee extends Coffee {

	public JavaCoffee() {
		description = "JavaCoffee";
	}

	@Override
	public double cost() {
		return 0.89;
	}
}
 
public class Cappuccnio extends Coffee {

	public Cappuccnio(){
		description = "Cappuccnio";
	}
	@Override
	public double cost() {
		return 0.77;
	}
}

 (4)、装饰者类CoffeeDecorator

public abstract class CoffeeDecorator extends Coffee {

	public abstract String getDescription();
}

 

(5)、具体装饰者类Milk、Mocha

public class Milk extends CoffeeDecorator {
	Coffee cooffee;

	public Milk(Coffee cooffee) {
		this.cooffee = cooffee;
	}

	@Override
	public String getDescription() {
		return cooffee.getDescription() + ", Milk";
	}

	@Override
	public double cost() {
		return 0.1 + cooffee.cost();
	}
}
 
public class Mocha extends CoffeeDecorator {
	Coffee cooffee;

	public Mocha(Coffee cooffee) {
		this.cooffee = cooffee;
	}

	@Override
	public String getDescription() {
		return cooffee.getDescription() + ", Mocha";
	}

	@Override
	public double cost() {
		return 0.2 + cooffee.cost();
	}
}

 ......

(6)、测试类

public static void main(String[] args) {
		
		Coffee coffee = new JavaCoffee();
		coffee = new Milk(coffee);
		coffee = new Mocha(coffee);
		
		System.out.println(coffee.getDescription() + "$" + coffee.cost());
	}
 

(7)、结果

----------------------------------------

JavaCoffee, Milk, Mocha$1.19

----------------------------------------

 

 

  • 大小: 55 KB
分享到:
评论

相关推荐

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

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

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

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    设计模式-装饰者模式

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

    JAVA-设计模式-结构型模式-装饰模式

    JAVA-设计模式-结构型模式-装饰模式

    c++设计模式-结构型模式-装饰器模式

    c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

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

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

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    Java设计模式-装饰者模式

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

    C++设计模式-基于QT4开源跨平台开发框架 源码

    设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(...者模式(Builder Pattern)、桥梁模式(Bridge Pattern)、命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式...

    游戏设计3-装饰者模式-装备

    装饰者模式是面向对象设计中的一种行为设计模式,它允许在运行时动态地给对象添加新的职责或行为,而无需改变对象本身。在游戏设计中,装饰者模式常常被用来扩展角色、装备等对象的功能,使得游戏内容更加丰富且易于...

    23种设计模式--装饰模式

    装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...

    设计模式-装饰者

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

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式...

    设计模式 - 装饰模式(C++实例)

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供了灵活性,使得我们可以独立于对象的组合来扩展功能。 在C++中,装饰...

    设计模式--装饰模式

    装饰模式(Decorator Pattern)是一种结构型设计模式,其主要目的是在不改变对象自身的基础上,在运行时为对象添加新的行为或属性。它通过包装原有对象,而不是通过继承来扩展功能,从而提供了更大的灵活性,避免了...

    【Java设计模式-源码】装饰器模式:动态扩展类的功能

    每一种添加物都像是装饰器设计模式中的一个装饰器。基础咖啡对象可以通过动态地添加额外的功能(口味、配料)来进行装饰。例如,你可以从一杯普通咖啡对象开始,然后用一个牛奶装饰器包裹它,接着是一个糖装饰器,...

Global site tag (gtag.js) - Google Analytics