《设计模式》一书对Decorator是这样描述的:
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类更为灵活。
也就是说:动态地给对象添加一些额外的功能。它的工作原理是:创建一个始于Decorator对象(负责新功能的对象)终止于原对象的一个对象的“链”。例如,我们要为超市的收银台设计一个打印票据的程序,有的需要打印票据的头信息,有的需要打印票据的页脚信息,有的只需要打印票据的内容。如果针对每一种情况都修改一次程序,势必会很麻烦。这时我们可以考虑使用Decorator模式。其结构类图如下:
代码如下:
abstract class Component{
abstract public void printTicket();
}
class SalesTicket extends Component{
public void printTicket() {
System.out.println("打印出salesTicket的内容");
}
}
abstract class TicketDecorator extends Component{
private Component myTrailer;
public TicketDecorator(Component myComponent){
myTrailer=myComponent;
}
public void callTrailer(){
if(myTrailer!=null)
myTrailer.printTicket();
}
}
class Header extends TicketDecorator{
public Header(Component myComponent){
super(myComponent);
}
public void printTicket(){
System.out.println("打印salesTicket的头信息");
super.callTrailer();
}
}
class Footer extends TicketDecorator{
public Footer(Component myComponent){
super(myComponent);
}
public void printTicket(){
super.callTrailer();
System.out.println("打印salesTicket的页脚信息");
}
}
public class Client {
public static void main(String[] args) {
System.out.println("====================================");
new Header(new Footer(new SalesTicket())).printTicket();
System.out.println("====================================");
new Footer(new Header(new SalesTicket())).printTicket();
System.out.println("====================================");
}
}
输出结果如下:
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
从这个例子我们可以看出,Decorator模式把问题分为两部分:
1)如何实现提供新功能的对象。
2)如何为每种特殊情况组织对象。
这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来,从而提高了内聚性,因为每个Decorator对象只用关心自己添加的功能,无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序,无需改变其任何代码。
小结:Decorator模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行。 (部分资料整理于网络)
分享到:
相关推荐
软件设计模式之装饰模式讲解ppt,可用于教学课件。
JAVA设计模式之装饰模式代码
设计模式之装饰模式 Java代码实现;另由本人所写,转载请注明原址。
设计模式之装饰模式的Java实现和类设计图。
装饰者模式是在不改变原有类和不使用继承的情况下,动态地扩展一个对象的功能,代码中通过对象参数进行选择。
23种设计模式之装饰模式对装饰模式进行了简单的介绍,并附带了例子程序,和大家分享
C++23种设计模式之 装饰模式。:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的...
c# ,设计模式,装饰者模式,星巴兹咖啡,基本上就是head first 上的例子的C#实现,根据自己的理解,作了一点点改动,可以直接运行。
设计模式
java设计模式之装饰者模式代码
新技术培训 培训讲义11_设计模式之装饰模式.doc 学习资料 复习资料 教学资源
根据售卖咖啡的过程,客户先选择一种口味的咖啡,又选择不同种类的配料,由于配料选择是不定的,符合装饰模式的应用情况。
java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式
java 23种设计模式 装饰模式,详细源码分析请看博客: http://blog.csdn.net/github_22022001/article/details/41543475
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...