(Decorator)
  1. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
  2. 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。
  3. 装饰模式可以在不增加子类的情况下,将对象的功能加以扩展
  4. 装饰模式是把客户端的调用委派到被装饰类。装饰模式的关键在于扩展完全透明的。
  5. 装饰模式是在不必改变原类文件使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是来包裹真实对象。

装饰模式的角色:

抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件角色(Concrete Component):定义一个将要接收附加责任的类。
装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口。
具体装饰角色(Concrete Decorator):负责给构件兑现“贴上”附加的责任。
装饰模式的特点:
  1. 装饰对象和真实对象有相同的接口,这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
  2. 装饰对象包含一个真实对象的引用。
  3. 装饰对象接收所有来自客户端的请求。它把这些请求转发给真实的对象。
  4. 装饰对象可以转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的接口就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能拓展。
时序图
IComponent.cs
    interface IComponent
    {
        void DoSomething();
    } 

ConcreteComponent.cs
    class ConcreteComponent : IComponent
    {
        public void DoSomething()
        {
            Console.WriteLine("功能A");
        }
    } 

Decretor.cs
    class Decretor : IComponent
    {
        private IComponent _component;
        public Decretor(IComponent Component)
        {
            this._component = Component;
        }
        public virtual void DoSomething()
        {
            this._component.DoSomething();
        }
    } 

ConcreteDecorator1.cs
    class ConcreteDecorator1 : Decretor
    {
        public ConcreteDecorator1(IComponent component):base(component){}
        public override void DoSomething()
        {
            base.DoSomething();
            this.DoAnotherThing();
        }
        private void DoAnotherThing()
        {
            Console.WriteLine("功能B");
        }
    } 

ConcreteDecorator2.cs
    class ConcreteDecorator2 : Decretor
    {
        public ConcreteDecorator2(IComponent component) : base(component) { }
        public override void DoSomething()
        {
            base.DoSomething();
            this.DoAnotherThing();
        }
        private void DoAnotherThing()
        {
            Console.WriteLine("功能C");
        }
    } 

Client.cs
    class Client
    {
        static void Main(string[] args)
        {
            Decretor decretor = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent()));
            decretor.DoSomething();
            
            Console.Read();
        }
    } 

例子2:
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/tangge/p/5900322.html

设计模式 -(5)装饰模式(结构型)相关推荐

  1. 设计模式7大结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 结构型模式:结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例.故可以分为类 ...

  2. 设计模式总结之结构型模式

    设计模式总结之结构型模式 结构型模式描述如何组织类和对象以组成更大的结构.结构型类模式采用继承机制来组合接口和实现,结构型对象模式则采用组合聚合来组合对象以实现新功能,可以在运行时刻改变对象组合关系, ...

  3. iOS设计模式四部曲(二) 结构型模式 内附Demo

    本篇是四部曲的第二篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式 内附Demo,关于设计模式强烈推荐图书<Head First设计模式>以及<研磨设计模式>.由于个人 ...

  4. 设计模式(17):结构型-组合模式(Composite)(2)

    设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式 ...

  5. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  6. 设计模式(13):结构型-装饰模式(Decorator)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. C++设计模式 | 四种结构型模式——代理模式、外观模式、适配器模式、装饰模式...

    结构型模式:让类和类进行组合,获得更大的结构. 代理模式 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端 ...

  8. 《设计模式》3.结构型模式

    点击进入我的博客 3.1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 3.1.1 类的适配器结构 目标(Targe ...

  9. Java设计模式之七大结构型模式

    总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 结构型模式,共有七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 其中适配器模式主要分为三类:类的适配 ...

  10. Java设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

最新文章

  1. vs实现python c扩展模块
  2. 严谨技术支撑vs奔放客户的100个真实写真
  3. npm、webpack、vue-cli 快速上手版
  4. 7.11牛客题(指针)
  5. linux命令 - ln - 创建和删除软、硬链接
  6. Yii2 upload
  7. 算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence
  8. 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)
  9. Beta 反(tu)思(cao) 获小黄衫感言
  10. cocos creator飞机大战总结
  11. python 高级部分
  12. 苹果receipt例子
  13. 性能测试工具的 Coordinated Omission 问题
  14. C2. Pokémon Army (hard version)
  15. STM32使用MDK keil 调试问题汇总
  16. 剑桥大学等提出MAGIC,一个即插即用、无需训练的图像-文本生成框架
  17. 零成本学arduino教程——74hc165扩展寄存器教程
  18. 计算机序号函数,用api函数读取硬盘的序列号
  19. 华为云05之网络虚拟化
  20. heroes案例中的路由

热门文章

  1. Android Telephony分析(三) ---- RILJ详解
  2. JZOJ 5678. 【GDOI2018Day2模拟4.21】果树
  3. JZOJ 3809. 【NOIP2014模拟8.25】设备塔
  4. 开发流媒体服务器_Github选出10大开源免费的RTSP流媒体项目
  5. python实现ping某一ip_Python实现ping指定IP的示例
  6. 计算广告学(Computational Advertising)CA
  7. [CODEVS 3147] 矩阵乘法 2
  8. 集合(normal)
  9. 迷宫pascal程序
  10. AtCoder AGC002F Leftmost Ball (DP、组合计数)