用最简单的例子理解装饰器模式(Decorator Pattern)
假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格。最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格。
每个产品都有名称和价格,首先设计一个关于产品的抽象基类。
public abstract class ProductBase{public abstract string GetName();public abstract double GetPrice();}
所有的产品都必须继承这个基类,比如家居用品、电器产品等,把这些具体的产品提炼成一个继承ProductBase的子类。
public class ConcretProuct : ProductBase{private string _name;private double _price;public ConcretProuct(string name, double price){this._name = name;this._price = price;}public override string GetName(){return _name;}public override double GetPrice(){return _price;}}
然后考虑产品组合。比如卖平底锅,可能送酱油,也有可能送酱油+老坛酸菜,可能的组合包括:
○ 平底锅
○ 平底锅 + 酱油
○ 平底锅 + 酱油 + 老坛酸菜
在这里,可以把酱油,老坛酸菜看作是装饰器,因为每加一个产品,都是在原有的基础上增加的。比如做"平底锅 + 酱油"这个组合,是在"平底锅"的基础上增加了"酱油"。
现在把酱油、老坛酸菜也设计成继承ProductBase的子类,也就是装饰器类。不过,与ConcretProuct类不同的是,装饰器类需要引用ProductBase,在这里,无论是显示产品组合还是计算产品产品组合价格,都离不开这个引用的ProductBase。
public class Decorator : ProductBase{private ProductBase _product = null;private string _name;private double _price;public Decorator(ProductBase product, string name, double price){this._product = product;this._name = name;this._price = price;}public override string GetName(){return string.Format("{0},{1}", _product.GetName(), _name);}public override double GetPrice(){return _product.GetPrice() + _price;}}
以上,显示产品名称的时候,把装饰器类Decorator引用的ProductBase的名称和当前名称组合起来,以逗号分隔;显示产品价格的时候,把引用的ProductBase的价格和当前价格相加。
客户端如下:
class Program{static void Main(string[] args){ConcretProuct livingProduct = new ConcretProuct("平底锅",100);Console.WriteLine(PrintProductDetails(livingProduct));Decorator dec1 = new Decorator(livingProduct,"海鲜酱油",10);Console.WriteLine(PrintProductDetails(dec1));Decorator dec2 = new Decorator(dec1, "老坛酸菜",12);Console.WriteLine(PrintProductDetails(dec2));Console.ReadKey();}private static string PrintProductDetails(ProductBase product){return string.Format("产品组合:{0} 价格:{1}", product.GetName(), product.GetPrice());}}

用最简单的例子理解装饰器模式(Decorator Pattern)的更多相关文章
- c#设计模式之装饰器模式(Decorator Pattern)
引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 设计模式(三)——装饰器模式(Decorator Pattern)
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...
- 23种设计模式之装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...
- 【UE4 设计模式】装饰器模式 Decorator Pattern
概述 描述 动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活.是一种对象结构型模式. 套路 抽象构件(Component) 具体构 ...
- php装饰器模式(decorator pattern)
十一点了. <?php /* The decorator pattern allows behavior to be added to an individual object instance ...
- 装饰器模式(Decorator)——深入理解与实战应用
本文为原创博文,转载请注明出处,侵权必究! 1.初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装 ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...
随机推荐
- HDU 3374 String Problem(KMP+最大(最小)表示)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...
- shell 中>/dev/null 2>&1含义
shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 分解这个组合:“>/dev/null 2>&1” 为五 ...
- appium+python 【Mac】Android夜神模拟器
1.官网下载地址:https://www.yeshen.com/ 2.具体的夜神模拟器的介绍请自查 3.下载安装后夜神模拟器后,打开模拟器,进行相应的配置如下: 4. (1).找到android-sd ...
- CCF CSP 201509-3 模板生成系统
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-3 模板生成系统 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据 ...
- Android应用程序签名打包(AS)
使用Android studio对Android应用签名步骤: 第一步: 第二步: 第三步: 第四步: 数字证书创建完成后,点击OK----->点击Next------>Finish. 注 ...
- C# 中从网络上下载文件保存到本地文件
下面是C#中常用的从Internet上下载文件保存到本地的一些方法,没有太多的技巧. 1.通过 WebClient 类下载文件 WebClient webClient = new WebClien ...
- Bootstrap进阶五:Web开发中很实用的交互效果积累
1.页面切换效果 我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果.  2.视差滚动(parallax-slider) 视差滚动(parallax-slider)已 ...
- caffe中根据 *_train_test.prototxt文件生成 *_deploy.prototxt文件 (转载)
见博客:http://blog.csdn.net/u010417185/article/details/52137825
- CentOS重装grub修复损坏的系统
grub损坏一般有两种情况:第一.安装双系统时,后安装的系统把先安装的系统的MBR删除了.第二.误操作将grub文件删除了. 不管怎样都需要进入到救援模式,详细请看CentOS通过光盘启动救援数据 ( ...
- mysql store procedure 存储过程
参考资料: 1.http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html 2.https://dev.mysql.com/doc/refman/5.7/ ...