参考 : Head First 设计模式(中文版)

这篇只作为个人温习!

用意 : 动态地给一个对象添加|扩展一些行为。Decorator 强调用对象组合而非继承来实现扩展,这显得较为灵活。

角色:

1.装饰者

2.被装饰者

特点与原理 :

0."被装饰者"被装饰之后,会被"装饰者"给包起来,外界看来它是被替代掉了,或者说原本的"被装饰者"被隔离了。

1."装饰者 "和"被装饰者 "必须是同一个抽象类派生出来的。(因为"装饰者"必须能替代掉"被装饰者")

2."装饰者"也可以被装饰(可以一直被再装饰),但是"被装饰者"不能装饰别人.

3."被装饰者"可以说是一个起点,一但它被"装饰者"装饰后,装饰者将替代掉它.

4.比如 a 对象被 b对象装饰后 , 外界就不能在访问a对象,b对象会保留a对象指针,那么外界通过调用 b 对象的方法来实现功能 , 这样我们便可以定义扩展方法在b对象上,b既可以调用原始a对象的方法,也可以添加扩展方法。

简单例子 :

public abstract class Product //基类
{
public abstract double getPrice(); //既然是要扩展,自然是用抽象方法咯
}
public class Nasi : Product //"被装饰者"一定要派生自基类
{
public override double getPrice()
{
return 100.00;
}
}
public abstract class Decorator : Product //"装饰者"一定要派生自基类
{
public Product product { get; set; } //每个装饰者都必须保留被装饰对象的指针
}
public class Sayur : Decorator
{
public Sayur(Product product) //这里的product既可以是"装饰者"也可以是"被装饰者"
{
this.product = product; //保存指针
}
public override double getPrice()
{
return this.product.getPrice() + ; //调用原来方法,再添加扩展逻辑
}
}
protected void Page_Load(object sender, EventArgs e)
{
Product nasi = new Nasi();
Product nasiWithSayur = new Sayur(nasi); //用Sayur这个"装饰者"来装饰product,装饰后product就被替换掉了.
Product nasiWithDoubleSayur = new Sayur(nasiWithSayur); //第2次装修返回的又是另一个对象了
double price = nasiWithDoubleSayur.getPrice();//由于我们是面向抽象编程,所以不管怎么装饰都好,这个对象依旧是一个Product,所以就一定有getPrice方法,只是它的内部已经是不同的实现了。
}

记忆联想 :

规范 : 装饰对象,和被装饰的对象都派生自一个类

实现 : 对象包对象,外层对象的方法是调用内层对象并且加上自己的逻辑扩展。

装饰者模式 (decorator pattern)的更多相关文章

  1. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  2. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  3. 设计模式 - 装饰者模式(Decorator Pattern) 具体解释

    装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...

  4. 设计模式学习--装饰者模式(Decorator Pattern)

    概念: 装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性. 解决方案: 装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也也就是有 ...

  5. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

  6. C#设计模式之装饰者模式(Decorator Pattern)

    1.概述 装饰者模式,英文名叫做Decorator Pattern.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2 ...

  7. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  8. 七个结构模式之装饰者模式(Decorator Pattern)

    定义: 使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂.并且可以保持和被装饰者同一个抽象接口,从而使客户端透明. 结构图: Component:抽象构件类,定 ...

  9. C#设计模式——装饰者模式(Decorator Pattern)

    一.例子在软件开发中,我们往往会想要给某一类对象增加不同的功能.比如要给汽车增加ESP.天窗或者定速巡航.如果利用继承来实现,就需要定义无数的类,Car,ESPCar,CCSCar,SunRoofCa ...

  10. 9.装饰者模式(Decorator Pattern)

    using System; namespace ConsoleApplication7 { class Program { static void Main(string[] args) { // 我 ...

随机推荐

  1. Java程序员容易犯的10个错误

    1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays.asList() 会返回一个Ar ...

  2. Swift基础语法学习总结一

    1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的. ...

  3. 【Cocos2d-X开发学习笔记】第10期:渲染框架之几何图形的绘制

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.图形的绘制 有时为了调试游戏,我们常常会需要 ...

  4. jquery实现停留半秒后再选择

    jquery实现tab停留半秒后,选中菜单.切换tab下的内容: var showHandler=null; function init(){ $("#tab_ul").find( ...

  5. 修改CKFinder上传路径

    一.CKFinder的若干问题 1.单独使用 ckfinder从原fckeditor分离出来以后可以单独使用,通常我习惯于在工具栏中添加ckfinder.dll,这样以后要使用ckfinder直接从工 ...

  6. Java多线程编程(一)

    1.Java创建多线程的方法一:(1)实现Runnable接口并实现其中的run()方法:(2)将Runable对象提交给一个Thread构造器,调用start()方法. [程序实例]单线程 publ ...

  7. 终极shell zsh

    在mac上安装zsh,推荐安装. 参见http://macshuo.com/?p=676. 安装成功提示,看着很帅的样子

  8. 对不起,说句粗话——这个太屌了,windows1.0安装程序(附下载)

    今天逛一个软件论坛发现的,仅仅有几百K.遥想当今我刚接触windows的版本号是3.1,当时记得非常清楚哦,进入windows要从dos命令行进入.如今一转眼,变成进入伪dos是执行栏里敲cmd了.唉 ...

  9. apk文件伪装zip64格式案例

    软件样本:http://files.cnblogs.com/files/mmmmar/FMRMemoryCleaner.apk 在论坛看在网友求助把一个小的app去广告,下载一看是清理内存的,刚开始让 ...

  10. 开源消息中间件DotNetMQ

    由于这个开源项目对我这种中间件菜鸟很有帮助,因此,我将官方的说明文档翻译如下: Introduction In this article, I will introduce a new and ind ...