用最简单的例子理解装饰器模式(Decorator Pattern)
模式 简单 理解 例子 装饰 pattern Decorator
2023-09-11 14:16:51 时间
假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格。最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格。
每个产品都有名称和价格,首先设计一个关于产品的抽象基类。
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());}}
相关文章
- Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持
- php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数
- 分布式数据库DDM Sidecar模式负载均衡
- 简单工厂模式
- js 最简单的发布订阅模式
- 使用wifi网卡笔记2----概念及工具iw(STA模式)
- python+selenium 浏览器无界面模式运行
- 【收藏】八爪鱼爬虫软件教程(7):新手入门-自定义模式
- Atitit 前后端交互模式 目录 1.1. Ajax1 1.2. Fetch api1 1.3. 服务端脚本模式(简单快速)1 1.4. 浏览器注入对象、函数1 1.5. 浏览器插件模式
- mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】
- std string与线程安全_这才是现代C++单例模式简单又安全的实现
- Python:设计模式之模型-视图-控制器-MVC复合模式
- Java IO的Reactor模式
- 简单工厂模式、工厂方法模式、抽象工厂模式 用图理解
- 简单工厂模式
- 简单工厂模式
- 行为型模式之Template Method模式
- 易学设计模式看书笔记(2) - 简单工厂模式
- 小米手机 开启开发者模式
- 23种设计模式-3工厂模式-简单工厂