我喜欢户外,然后常常去逛户外装备的店子,一般买了自行车等大件,再买登山包,登山鞋等配件就会有优惠。比如买了辆Giant的车,然后买个bag就有优惠,本案例将配件作为装饰者,简单的实现装饰者模式,对于继承,多态掌握的还是很迷惑。有错误还请各位看官帮忙指出,仪器共同进步!

首先定义一个超类Buybike

 public abstract class Buybike{protected string description="To Get a Bike";public virtual string getDescription(){return description;}public abstract string Cost();}

超类下面定义一个装饰者超类OtherDecorator(所有装饰者【案例中配件】的父类)

 
public abstract class OtherDecorator:Buybike{//只是为了将装饰者全部置于其下,无具体实现方法}
下面是两个被装饰的类Giant Merida(捷安特,美利达)
class Merida:Buybike{public Merida(){description = "Merida";}public override string Cost(){return "2000RMB";}}
public class Giant : Buybike{public Giant(){description = "Giant";}public override string Cost(){return "3000RMB";}}
接下去是所有装饰者(配件),全部继承自OtherDecorator
class AddShirt:OtherDecorator{private  Buybike buyBike;public AddShirt(Buybike buyBike){this.buyBike = buyBike;}public override string getDescription(){return buyBike.getDescription() + "Add a shirt";}public override string Cost(){return buyBike.Cost() + "shirt's money:600RMB";}}
class AddShoes:OtherDecorator{private  Buybike buyBike;public AddShoes(Buybike buyBike){this.buyBike = buyBike;}public override string getDescription(){return buyBike.getDescription() + "Add a shoes";}public override string Cost(){return buyBike.Cost() + "shoe's money:300RMB";}}
class AddBag:OtherDecorator{private  Buybike buyBike;public AddBag(Buybike buyBike){this.buyBike = buyBike;}public override string getDescription(){return buyBike.getDescription() + "Add a bag";}public override string Cost(){return buyBike.Cost() + "bag's money:200RMB";}}    

程序运行如下:

    class Program{static void Main(string[] args){Buybike a= new Giant();a = new AddBag(a);a = new AddShirt(a);Console.WriteLine(a.Cost());Console.WriteLine(a.getDescription());}}

此模式好处:装饰者和被装饰者从相同基类派生,类型之间的转化非常方便,适合多态的实现。

具体到例子,此处的a具体到是一个基类变量,把它指到下面的子类不必进行类型转化,而且a具体是什么类型,得在运行时才能确定,程序耦合度大大降低。

转载于:https://www.cnblogs.com/wyixin/archive/2011/12/13/2286183.html

装饰者模式(C#)实现相关推荐

  1. java设计模式----装饰器模式

    Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. ...

  2. Android 设计模式:(三)装饰者模式 —— 装饰对象

    *利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为. *利用继承扩展子类的行为,是在编译时静态决定的:利用组合的做法,可以在运行 ...

  3. java I/O之装饰者模式

    装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...

  4. 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:双子孤狼 blog.csdn.net/zwx9001 ...

  5. 这是我见过最通俗易懂的 装饰者模式 讲解了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:lewis0077 cnblogs.com/lewis007 ...

  6. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  7. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

  8. 3年工作必备 装饰器模式

    故事 古话说的好:人靠衣裳马靠鞍.下面先带大家来熟悉这句话的背景: 人靠衣装马靠鞍,狗配铃铛跑的欢出自沈自晋<望湖亭记>第十出:"虽然如此,佛靠金装,人靠衣装,打扮也是很要紧的. ...

  9. 装饰者模式 php,PHP设计模式之装饰器模式

    装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...

  10. 漫画设计模式:什么是 “装饰器模式” ?

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) -----  第二天  ----- ------------ 装饰器模式都包含哪些核心角色呢? 1. Compone ...

最新文章

  1. 计算机的组成_计算机网络的组成和分类
  2. 用HTML和CSS实现一个漂亮的个人博客页面!
  3. Qt在控制台输出中文的解决办法(转载)
  4. HierarchicalDataTemplate中的ContextMenu的Command绑定
  5. 通过hook实现禁止shift+delete快捷键
  6. 伺服扭矩模式怎么控制_气液增压缸是怎么增压的?气液增压缸好用吗?气液增压缸的原理及其伺服控制...
  7. ldconfig清理缓存
  8. 芯片数据分析步骤5 过滤探针
  9. 【论文阅读|深读】Net2Net-NE:Learning Network-to-Network Model for Content-rich Network Embedding
  10. 如何通俗的解释全微分?
  11. linux cp报错 扩展 失败,linux使用cp报错 Text file busy
  12. 计算机网络 带宽_什么是带宽(计算机网络)?
  13. Android中Vitamio视频框架学习
  14. 滚珠螺杆螺母的安装教程来了
  15. NSDate 转为NSString 时差的问题
  16. 网易免费企业邮箱Foxmail设置方法
  17. 大数据2--hive--hive介绍
  18. 国产化半实物仿真测试工具——Etest
  19. 大白菜U盘启动盘重装系统
  20. Hbuilder X 配置Git、SVN项目管理工具

热门文章

  1. 如何快速将所有东西从旧的Intel Mac迁移到新的M1 MacBook
  2. 6、PXE安装ESXI6.0
  3. 居中 html css
  4. linux下安装Telnet服务器
  5. java中list、set和map 实例
  6. 遮罩层 fixed 在 ie 里无法显示
  7. 论Spring开发框架
  8. Linux上查到目前透过FTP进来的使用者
  9. [readable]轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
  10. IDM(Internet Download Manager)下载各类安装包(github代码、python包)、软件、视频、文档的神器,居家必备良药