参考 : 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. apt-mirror

    对于centos来说,搭建一个本地源,相对来说,还是比较简单的.对于ubuntu来说,就复杂很多, 估计也和我不熟悉有关. http://unixrob.blogspot.com/2012/05/cr ...

  2. D - 棋盘游戏 - HDU 1281(二分图匹配)

    分析:先求出来最大匹配数,然后用匹配的点一个一个去除看看能否达到最大匹配,能的话就是关键点(很暴力啊),不过竟然才31ms ************************************** ...

  3. XML (DOM解析) 看看就行

    000000000000000000000000000000000000000 ------------------------------------------------------------ ...

  4. Android Framework 记录之二

    接着上次的记录,续写. 23.services文件夹 文件 描写叙述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 p ...

  5. 树莓派学习笔记——交叉编译练习之SQLite3安装

    0.前言     本博文可能并没有太多使用价值.不过为了练习而练习.在树莓派上使用SQLite有非常多的方法,安装的方法也有非常多.     [1]假设使用Python,那么不必安装SQLite由于P ...

  6. ICMP报文分析

    一.概述: 1.   ICMP同意主机或路由报告差错情况和提供有关异常情况.ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议.通常ICMP报文被IP层或更高层协议(TCP或UDP) ...

  7. php开启ssl支持

    1.首先在php的安装文件下找到三个文件 并copy到系统目标下的 system32文件夹下: ssleay32.dll.libeay32.dll,php_openssl.dll. 2.打开php.i ...

  8. python复制--笔记

    对象引用: >>> songs = ["Bee","Core","Love"] >>> bat = so ...

  9. 自定义Toast

    简易自定义Toast public class MainActivity extends ListActivity );//边角         gradientDrawable.setGradien ...

  10. ASP.NET-FineUI开发实践-3

    1.参照模拟数据库分页通过缓存重写内存分页,优化页面响应速度 Grid的响应速度是硬伤,我写了个通用方法把所有数据放在缓存中模拟数据库分页,比自带的缓存分页快很多,这里贴上实体类的通用方法,DataT ...