意图

动态的给一个对象添加一些额外的职责。

适用性

  • 动态的为单个对象添加职责而不影响其他对象
  • 处理那些可以撤销的职责(? 在某些功能不需要时删除这些功能)
  • 当不能采用生成子类的方法进行扩展时

结构

实现

设计一些饮料,这些饮料可以由顾客选择添加各种佐料。
先是饮料的抽象类

 abstract class Beverage
{
protected string Description = "Unknown Beverage";
public virtual string GetDescription()
{
return Description;
}
public abstract double Cost();
}

接下来是具体的饮料类

 class Coffee:Beverage
{
public Coffee()
{
Description = "coffee";
}
override public double Cost()
{
return 1.99;
}
}

然后是装饰器的抽象类,它不仅继承了饮料的抽象,而且还它包含一个饮料成员

abstract class CondimentDecorator : Beverage
{
protected Beverage Beverage;
override public abstract string GetDescription();
}

最后是两个具体的装饰器

    class Milk:CondimentDecorator
{
public Milk(Beverage beverage)
{
this.Beverage = beverage;
}
override public string GetDescription()
{
return "Milk " + Beverage.GetDescription();
}
override public double Cost()
{
return .10 + Beverage.Cost();
}
} class Mocha:CondimentDecorator
{
public Mocha(Beverage beverage)
{
this.Beverage = beverage;
}
override public string GetDescription()
{
return "Mocha " + Beverage.GetDescription();
}
override public double Cost()
{
return .20 + Beverage.Cost();
}
}

现在,顾客可以随意选择佐料了

   class Program
{
static void Main(string[] args)
{
Beverage beverage = new Coffee();
Console.WriteLine(beverage.GetDescription() + ": $" + beverage.Cost());
Beverage mocha = new Mocha(beverage);
Console.WriteLine(mocha.GetDescription() + ": $" + mocha.Cost());
Beverage milk = new Milk(beverage);
Console.WriteLine(milk.GetDescription() + ": $" + milk.Cost());
Beverage mochaMilk = new Milk(mocha);
Console.WriteLine(mochaMilk.GetDescription() + ": $" + mochaMilk.Cost());
Console.ReadKey();
}
}

运行结果

效果

1.比静态继承灵活
2.避免在层次结构高层的类有太多的特征
3.装饰器与它装饰的对象不一样,使用时不能依赖对象表示
4.会产生许多小对象

参考

  1. 《Head First 设计模式》
  2. 《设计模式》

设计模式C#实现(十二)——装饰模式的更多相关文章

  1. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  2. javascript设计模式学习之十二——享元模式

    一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...

  3. 设计模式之(十)装饰模式(DECORATOR)

    在购买了一个房子后,如果是毛坯房,肯定不合适直接入住的.需要对它进行装修:地面找平贴地砖.批墙贴墙纸.吊顶装订以及买需要的家具,住进去以后也可能根据需要再添加或者去掉一些家具或者修改一些东西.所以的这 ...

  4. Java 设计模式系列(十二)代理模式

    Java 设计模式系列(十二)代理模式 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. package com.github.binarylei.de ...

  5. 设计模式之(十二)享元模式(Flyweight)

    享元模式思想 就以小时候导锅来说吧(导锅是我家乡的方言,就是用细沙把一个模型锅的形状拓下来,然后把铝水倒进模型中,就导好一个锅了.小时候很喜欢看的,可惜现在看不到了.上个图片回忆下)了解了这个过程后就 ...

  6. [设计模式] 设计模式课程(十二)-- 门面模式(Facade)

    概述 也称外观模式 按目的属于结构型模式,按封装属于接口隔离模式 在组件构建过程中,某些接口之间的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口 ...

  7. Java设计模式之(十二)——观察者模式

    1.什么是观察者模式? Define a one-to-many dependency between objects so that when one object changes state, a ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  10. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

随机推荐

  1. web.xml中openEntityManagerInViewFilter的作用(转)

    <filter> <filter-name>openEntityManagerInViewFilter</filter-name> <filter-class ...

  2. Map遍历两种方式

    Java代码 Map<String,String> map=new HashMap<String,String>(); map.put("username" ...

  3. MySQL日期处理(笔记)

    对于刚学习MySQL的人日期的处理是个大坑. 这里整理了如何处理常见的日期问题. (这只是我在学习过程中关于日期处理方面知识的总结,会有一些错误和片面的地方.) Date 函数 函数 描述 NOW() ...

  4. [javaSE] 反射-Class类的基本操作

    获取类的名称 获取该类的方法 获取方法的返回值类型 获取方法的名称 获取方法的参数的类型 package com.tsh.reflect; import java.lang.reflect.Metho ...

  5. java 小程序-- 汉诺塔

    1.code public static void main(String[] args) { ; moveDish(, 'A', 'B', 'C'); } public static void mo ...

  6. Java的“友好的”访问指示符(修饰符)

    如果根本不指定访问指示符,就象本章之前的所有例子那样,这时会出现什么情况呢?默认的访问没有关键字,但它通常称为"友好"(Friendly)访问.这意味着当前包内的其他所有类都能访问 ...

  7. C++之迭代器

    迭代器的概念 迭代器是用来访问string对象或vector对象的元素的,类似于下标运算和指针. 其对象是容器中的元素或string对象中的字符: 使用迭代器可以访问某个元素,迭代器也能从一个元素移动 ...

  8. SWFObject Flash 增强插件

    SWFObject 2提供两种优化flash播放器的嵌入方法:基于标记的方法和依赖于js的方法. SWFObject 2提供一个js的API,为嵌入SWF文件和获取Flash播放器的相关信息提供了一个 ...

  9. ImageLightbox.js – 响应式的图片 Lightbox 插件

    ImageLightbox.js 是一款很简洁的用于显示图片灯箱效果(Lightbox)的插件,没有字幕,导航按钮或默认背景.如果默认功能不够用的话,你可以很容易地自定义 JavaScript 函数扩 ...

  10. [deviceone开发]-纳豆项目源码开源

    一.简介 已上线的纳豆项目开源.这个App做的非常好,细节处理的很流畅,使用了很多小的动画效果,极力推荐,很多功能可以从这个应用中获取代码和灵感. 二.效果图        三.相关下载 androi ...