head first (三):装饰者模式
看到别人写的,都看不进去,算了还是自己手写一遍吧,算是帮助自己理解了。写的比较简单,例子也比较好懂,什么时候使用自己看着办。
1.定义
装饰者模式:动态地将职责附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。
装饰者和被装饰者对象都哟相同的超类。
装饰者会使程序中出现很多小类,增加使用难度
可以透明的插入装饰者,客户都不知道是和装饰者打交道
2:使用场景
对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展。
例如,现在需要一杯饮料,主体是水,可以选择添加甜味、咸等其他味道,这种情况下就可以使用装饰者模式。
3:代码实现
基类,抽象类
public abstract class Drink
{
public string DrinkName = ""; //直接打印出名称
public void PrintName()
{
Console.WriteLine(DrinkName);
} public abstract double Cost(); }
被装饰者,水。也可以是茶和其他的饮料
public class Water : Drink
{
public Water()
{
DrinkName = "水";
} public override double Cost()
{
return ;
}
}
装饰者,加糖,盐等
/// <summary>
/// 甜味,每份2元,有点贵额
/// </summary>
public class Sweet:Drink
{
private Drink BaseDrink;
public Sweet(Drink drink)
{
BaseDrink = drink;
DrinkName = " 加糖"+BaseDrink.DrinkName;
} public override double Cost()
{
return BaseDrink.Cost()+;
}
}
/// <summary>
/// 加盐
/// </summary>
public class Salt : Drink
{
private Drink BaseDrink;
public Salt(Drink drink)
{
BaseDrink = drink;
DrinkName = " 加盐"+BaseDrink.DrinkName ;
} public override double Cost()
{
return BaseDrink.Cost() + ;
}
}
老板来一份 加一份盐,2份甜味的水,这个味道重口味额
static void Main(string[] args)
{
Drink OrderDrink = new Water(); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Salt(OrderDrink); OrderDrink.PrintName(); Console.WriteLine("您所需的价钱为:"+OrderDrink.Cost()); Console.ReadKey();
}
好了,饮料来了,付钱吧!骚年...

head first (三):装饰者模式的更多相关文章
- 设计模式学习(三): 装饰者模式 (附C#实现)
需求 做一个咖啡店的订单系统. 买咖啡时,可以要求加入各种调料,如奶,豆浆,摩卡等.咖啡店会根据调料的不同收取不同的费用.订单系统要考虑这些. 初版设计 然后下面就是所有的咖啡....: cost方法 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
- JAVA设计模式详解(三)----------装饰者模式
今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...
- 设计模式(三)装饰者模式Decorator
装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能. 一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能. 我们还是来玩一句红警,首 ...
- 设计模式PHP篇(三)————装饰器模式
简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...
- HeadFirst设计模式 之 C++实现(三):Decorator(装饰者模式)
装饰者模式是非常有意思的一种设计模式,你将可以在不改动不论什么底层代码的情况下.给你的(或别人的)对象赋予新的职责. 不是使用继承每回在编译时超类上改动代码,而是利用组合(composition)和托 ...
- 深入探索Java设计模式(三)之装饰器模式
装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...
- 设计模式(三)——装饰器模式(Decorator Pattern)
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...
随机推荐
- mapper的前后缀
1.<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=&quo ...
- bzoj 4723 [POI2017]Flappy Bird 模拟
[POI2017]Flappy Bird Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 482 Solved: 196[Submit][Status ...
- frame外弹出,刷新父页面
//刷新父页面 function reflashParent() { var id = parent.tabbar.getActiveTab(); id = id.replace('tab','mai ...
- How to Disable System Integrity Protection (rootless) in OS X El Capitan
mac在10.11之后增加了一个功能,号称"System Integrity Protection, often called rootless",有了这个功能,以下目录的东西都不 ...
- consul windows安装
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开 ...
- Android开发——为移动的Paint元素指定图片的方法
源 起 最近在写一个类似“围住神经猫”的应用,现在需要给一个可以移动的Paint元素指定一张图片,如下图,要把黄点改成其他图片: Paint所在的类继承于SurfaceView,SurfaceVie ...
- jQuery清空表单方法
$(':input', '#form1') .not(':button, :submit, :reset, :hidden') .val('') .removeAttr('checked') .rem ...
- 边绘边理解prototype跟__proto__
网上流传着一张讲解prototype跟__proto__关系的图,尽管他已经描绘的很清楚了,但对于初学者来说,江太公感觉还是过于纠结,于是起心重绘,让他们之间的关系更加明晰可理解,一方面出于分享目的, ...
- 如何修改或美化linux终端
先丢一张效果图: 如何让您的 LD 的终端更具个性呢?首先,我们需要了解下面几点知识.A:配置文件 个人配置文件:~/.bashrc全局设定文件:/etc/bash.bashrc(修改需要管理员权限) ...
- linux系统下git使用
转载:http://www.cnblogs.com/bear2flymoon/p/4335364.html?ADUIN=563508762&ADSESSION=1430887070&A ...