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中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...
装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...
《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...
在“设计模式—装饰者模式”中,我们将深入探讨这个模式的概念、实现方式以及实际应用。 装饰者模式的核心概念在于“装饰”(Decorator)和“组件”(Component)。组件是被装饰的基本对象,它可以是接口或者抽象类...
JAVA-设计模式-结构型模式-装饰模式
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...
装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...
设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...
代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(...者模式(Builder Pattern)、桥梁模式(Bridge Pattern)、命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式...
装饰者模式是面向对象设计中的一种行为设计模式,它允许在运行时动态地给对象添加新的职责或行为,而无需改变对象本身。在游戏设计中,装饰者模式常常被用来扩展角色、装备等对象的功能,使得游戏内容更加丰富且易于...
装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...
装饰者设计模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或属性,而无需修改对象的源代码。这种模式的核心在于装饰者和组件接口是相同的,因此装饰者可以完全替代原对象,同时还能增加额外的功能,...
- 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式...
装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供了灵活性,使得我们可以独立于对象的组合来扩展功能。 在C++中,装饰...
装饰模式(Decorator Pattern)是一种结构型设计模式,其主要目的是在不改变对象自身的基础上,在运行时为对象添加新的行为或属性。它通过包装原有对象,而不是通过继承来扩展功能,从而提供了更大的灵活性,避免了...
每一种添加物都像是装饰器设计模式中的一个装饰器。基础咖啡对象可以通过动态地添加额外的功能(口味、配料)来进行装饰。例如,你可以从一杯普通咖啡对象开始,然后用一个牛奶装饰器包裹它,接着是一个糖装饰器,...