用最简单的例子理解装饰器模式(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; ...
随机推荐
- 文件下载功能django+js
1. 功能叙述 前端web页面通过访问url+id的形式访问url lottery/draw/(?P<pk>(\d+))/download/ 后端代码通过orm查询pk相关数据 过滤出自己 ...
- CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
漏洞简述 Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件. Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...
- Android 客户端 okhttp3 与服务器之间的双向验证
[原文]https://blog.csdn.net/leng_wen_rou/article/details/58596142 本篇是Android 客户端基于okhttp3的网络框架 和后台服务器之 ...
- sdoi2014-向量集-线段树-二分斜率
注意到线段树一个节点只有满了才会被用到,那时再建ConvexHull就行了... #include <bits/stdc++.h> using namespace std; namespa ...
- 【POJ】4007.Flood-it!
原题戳这里 题解 搜索是个好东西,不是人人都会搜 迭代加深,然后用一个函数估值,值是除了和左上连通的部分还有几个颜色不同的块,如果走的步数加上估值大于当前枚举的深度就跳出 代码 #include &l ...
- linux开启端口
开放端口的方法: 方法一:命令行方式 1. 开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT ...
- pyqt5猜数小程序
程序界面用qt设计师制作,并用pyuic5命令转换成form.py文件 #-*- coding:utf-8 -*- from PyQt5.QtWidgets import QApplication,Q ...
- Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
maven项目遇到这类问题基本上是两方面的原因,类对应的依赖没有加载进来.编译器自身的设置和缓存问题. 解决第一类:1.检查项目的pom文件,是否必要的依赖都写清楚了: 2.是否使用自己的私有库,&l ...
- Effective C++ —— 模板与泛型编程(七)
C++ templates的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map.然而当愈多人用上templates,他们发现templates有能力完成愈多可能的变化 ...
- JXOI2017-2018 解题报告
链接:JXOI2017-2018 解题报告 代码预览:Github