1. 装饰模式简介

  装饰模式动态地给一个对象添加额外的职责。例如一幅画有没有画框都可以挂在墙上,画就是被装饰者。但是通常都是有画框的。在挂在墙上之前,画可以被蒙上玻璃,装到框子里,所以在画上加一层画框,并把它们组合成一个整体——有框的画。这样随着不断有新的装饰的加入,就给商品不断地打上包装,变成一个功能更让人满意的商品。这种不断打包装的过程就是装饰。

1.1 定义

  装饰模式提供了一种给类增加功能的方法。它通过动态地组合对象,可以给原有的类添加新的代码,而无须修改现有代码。因此引入bug或产生意外副作用的机会将大幅度减少。

1.2 使用频率

   中等

2. 装饰模式结构图

2.1 结构图

2.2 参与者

  装饰模式参与者:

  ◊ Component:定义一个对象接口,可以给这些对象动态地添加职责

  ◊ ConcreteComponent:定义一个对象,可以给这个对象添加一些职责

  ◊ Decorator:维持一个指向Component的指针,并定义一个与Component接口一致的接口

  ◊ ConcreteDecorator:负责向ConcreteComponent添加功能

  在装饰模式中,Decorator定义了一个装饰接口类。因为Decorator与ConcreteComponent继承同一个接口,所以继承Decorator的类ConcreteDecorator可以使用ConcreteComponent的方法,再在ConcreteDecorator里面加入一些新的方法,也就是装饰,就成为了一个包装好的装饰类。

3、装饰模式结构实现

  Component.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.DecoratorPattern.Structural
{public abstract class Component{public abstract void Operation();}
}

  ConcreteComponent.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.DecoratorPattern.Structural
{public class ConcreteComponent : Component{public override void Operation(){Console.WriteLine("ConcreteComponent.Operation()");}}
}

  Decorator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.DecoratorPattern.Structural
{public abstract class Decorator : Component{protected Component component;public void SetComponent(Component component){this.component = component;}public override void Operation(){if (component != null){component.Operation();}}}
}

  ConcreteDecoratorA.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.DecoratorPattern.Structural
{public class ConcreteDecoratorA : Decorator{public override void Operation(){base.Operation();Console.WriteLine("ConcreteDecoratorA.Operation()");}}
}

  ConcreteDecoratorB.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.DecoratorPattern.Structural
{public class ConcreteDecoratorB : Decorator{public override void Operation(){base.Operation();AddedBehavior();Console.WriteLine("ConcreteDecoratorB.Operation()");}void AddedBehavior(){}}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using DesignPatterns.DecoratorPattern.Structural;namespace DesignPatterns.DecoratorPattern
{class Program{static void Main(string[] args){// Create ConcreteComponent and two DecoratorsConcreteComponent c = new ConcreteComponent();ConcreteDecoratorA d1 = new ConcreteDecoratorA();ConcreteDecoratorB d2 = new ConcreteDecoratorB();// Link decorators
            d1.SetComponent(c);d2.SetComponent(d1);d2.Operation();}}
}

  运行输出:

ConcreteComponent.Operation()
ConcreteDecoratorA.Operation()
ConcreteDecoratorB.Operation()
请按任意键继续. . .

4、装饰模式应用分析

  装饰模式适用情形:

  ◊ 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责

  ◊ 处理那些可以撤销的职责

  装饰模式的特点:

  ◊ 比静态类更灵活。使用装饰模式可以很容易地向对象添加职责的方式。可以用添加和分离的方法,对装饰在运行时添加和删除职责。相比之下,继承机制要求为每个添加的职责创建一个新的子类。这会产生很多新的类,并会增加系统的复杂度。

  ◊ 使用装饰模式可以很容易地重复添加一个特性,而两次继承特性类则极容易出错。

  ◊ 为了避免处理顶层的类有太多的特征。装饰模式下,你可以定义一个简单的类,并用装饰类给它逐渐地添加功能。这样可以从简单的部件组合出复杂的功能,具有低依赖性和地复杂性。

  ◊ 有许多小对象。采用装饰模式进行系统设计往往会产生许多看上去类似的小对象,尽管对于了解这些系统的人来说,很容易进行定制,但是很难学习这些系统,排错很恶化呢困难。

转载于:https://www.cnblogs.com/libingql/p/3634350.html

C#设计模式系列:装饰模式(Decorator)相关推荐

  1. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...

  2. 设计模式之装饰模式(Decorator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 设计模式之装饰模式(Decorator)

    目录 前言 Decorator设计模式 解决的问题 案例:流操作的扩展 模式定义 结构 要点总结 前言 在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下 ...

  4. c语言装饰,C++设计模式之装饰模式(Decorator)

    装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类 ...

  5. 设计模式系列-装饰模式

    下班回家无聊在加上本命年有些不太顺利,决定看男人帮打发下班的无聊时间,点击第十八集,开场白: 我们生活在这个 一秒钟一个变化的世界里 有时候友情比爱情更为可靠 朋友可以在你最艰苦的时候 默默守候 在你 ...

  6. 设计模式系列----装饰模式的理解

    装饰模式 提到装饰,我们先来想一下生活中有哪些装饰: 女生的首饰:戒指.耳环.项链等装饰品 家居装饰品:粘钩.镜子.壁画.盆栽等 我们为什么需要这些装饰品呢?很容易想到是为了美,戒指.耳环.项链.壁画 ...

  7. 设计模式理解:装饰模式Decorator

    装饰模式,又称包装器(wrapper),该模式的使用场景是,动态的给对象扩展一些额外的职责.职责即功能,所谓"动态"表示可以任意搭配我想要的功能,功能调用的先后顺序也可以任意设置. ...

  8. 设计模式(Java)----装饰模式Decorator

    如何使"对象功能的扩展"能够根据需要来动态地实现?同时避免"扩展功能的增多"带来的子类膨胀问题?从而使得任何"功能扩展变化"所导致的影响降为 ...

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

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

  10. .NET设计模式系列文章

    .NET设计模式系列文章 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写 ...

最新文章

  1. NTFS for Mac OS X:使用Brew安裝NTFS-3G
  2. pytorch attention 注意力
  3. python常用内置模块-Python-常用的内置模块
  4. 【pytorch学习】四种钩子方法(register_forward_hook等)的用法和注意点
  5. 本地存储localStorage
  6. vue的diff 算法
  7. android系统语音合成,android 语音合成报错
  8. 如何使虚拟机VMware workstation连接局域网
  9. java 匹配冒号,java 冒号参数 java 获取冒号后面的参数(正则)实现代码
  10. 习题4-1 求奇数和 (15分) 本题要求计算给定的一系列正整数中奇数的和
  11. Vant => van-field校验手机号 邮箱校验
  12. Ubuntu 挂在硬盘、内存
  13. xcode 配置wechat_Xcode 真机调试微信支付 提示 mainfest.json配置APPID和订单的appid 不一致...
  14. 3种性格容易焦虑 你知道吗
  15. 第七期 | 网约车司机的“捞偏门”手段:作弊抢单、空跑刷单
  16. 微信小程序 data命名不能大写
  17. jQuery根据ID、CLASS、等获取对象
  18. reactive() 函数
  19. Java并发编程Future超详细教程
  20. DBLP实验数据集处理

热门文章

  1. AVCaptureDevice 属性介绍
  2. Spring事务管理2----编程式事务管理
  3. 搞搞Linux命令--grep
  4. Google Guava之--cache
  5. Java学习,继承关系的学习和理解
  6. sql server从一个数据库复制一张表到另外一个数据库
  7. 【难点+重点BFS】LeetCode 126. Word Ladder II
  8. 自定义文件系统下的磁盘访问次数计算
  9. sqoop安装及使用
  10. ActionErrors和ActionError