案例转自https://www.cnblogs.com/stonefeng/p/5679638.html

//主体基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
   abstract class PanCake
    {
        public string desc = "";
        public abstract string getDesc();
        public abstract double price();
    }
}

//主体:肉夹馍

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
    class Roujiamo:PanCake
    {
        public Roujiamo()
        { this.desc = "肉夹馍"; }

public override string getDesc()
        {
            return desc;
        }

public override double price()
        {
            return 6;
        }

}
}

//主体手抓饼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
    class TornCake:PanCake
    {
        public TornCake()
        {
            this.desc = "手抓饼";
        }

public override string getDesc()
        {
            return desc;
        }

public override double price()
        {
            return 4;
        }
       
    }
}

//装饰者基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
   abstract class Condiment:PanCake
    {
        public PanCake panCake;
        public Condiment(PanCake p)
        {
            panCake = p;
        }

}
}

//装饰者煎蛋

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
    class FiredEgg:Condiment
    {
        public FiredEgg(PanCake pancake):base(pancake)
        {
        }
        public override string getDesc()
        {
            return panCake.getDesc()+",煎蛋";
        }
        public override double price()
        {
            return this.panCake.price() + 2;
        }
    }
}

//主函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DecoratorModeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            TornCake torncake = new TornCake();
            Console.WriteLine(torncake.getDesc() + " ¥" +torncake.price().ToString());

PanCake roujiamo = new Roujiamo();
            roujiamo = new FiredEgg(roujiamo);
            roujiamo = new FiredEgg(roujiamo);
            Console.WriteLine(roujiamo.getDesc()+" ¥"+roujiamo.price());
            Console.ReadLine();
           
        }
    }
}

运行结果

心得:装饰者派生自主体基类,继承了主体需要操作的对象。同时装饰者的成员对象中有主体,用以耦合主体。通过创建不同的装饰者派生类,重写主体类方法来实现对主体类的不同操作。

roujiamo = new FiredEgg(roujiamo)实际上roujiamo已经变成了煎蛋,只不过这个煎蛋的成员包含肉夹馍,返回的方法经重写已经用原肉夹馍处理过了。

最新文章

  1. Java源码分析之ArrayList
  2. Linode 优惠码
  3. 用C#.NET编写软件注册机
  4. sqlite中的自增主键
  5. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
  6. hdu 1527 取石子游戏(Wythoff Game)
  7. 改成 否“依然报LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题的解决
  8. C++ Double Ended Queues(双向队列)
  9. mysql查询结果中文显示成了问号
  10. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
  11. 使用Markdown在博客里插入代码
  12. DontDestroyOnLoad
  13. mantis 中文统计报表乱码问题解决办法
  14. dispatch_once认识分析
  15. [CLR via C#]5.2 引用类型和值类型
  16. we7 数据库
  17. 团队作业7---Alpha冲刺之事后诸葛亮
  18. UE4 C++与蓝图交互
  19. Windows 10 更改系统文字大小
  20. day 54 JS 之 jquery

热门文章

  1. 省市区三级联动picker-view-微信小程序
  2. 键'attachdbfilename'的值无效。
  3. Flask系列05--Flask的配置config
  4. CF1082解题报告
  5. dubbo-admin 出现警告(不影响使用)
  6. Django(ORM查询1)
  7. Spring常用知识点
  8. Mxonline3.6 在阿里云服务器上的部署(uwsgi nginx)
  9. 线程中的同步辅助类Exchanger
  10. TCP 流量控制、拥塞控制