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例子
设计模式--装饰模式 设计模式--装饰模式 设计模式--装饰模式 设计模式--装饰模式
设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)
设计模式 - 装饰者模式
23种设计模式--装饰模式
装饰者模式:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案
JAVA-设计模式-结构型模式-装饰模式
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
设计模式 - 装饰模式(C++实例) 若有问题,请指出。
设计模式—装饰者模式,介绍的非常详细,讲解透彻
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
java常用设计模式-装饰器模式
设计模式-装饰模式(讲解及其实现代码)
ios 平台实现设计模式-访问者模式,以最简单的代码实现访问者模式讲解,主旨在于了解访问者模式,博客:http://blog.sina.com.cn/s/blog_161d504630102wwxe.html
设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
java设计模式--策略模式 HeadFirst书中的 装饰者模式
使用PHP实现的设计模式之装饰者模式,希望对您的开发有所启发。
ios平台中通过最简单的代码讲解装饰器模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释