C#设计模式--装饰器模式
设计模式:
装饰器模式(Decorator Pattern)
简单介绍:
装饰器模式(Decorator Pattern):
假设有一部手机你购买来以后只有手机,然后你需要再给其添加一些装饰,比如保护壳,钢化膜或者手机贴画等,这个就是装饰者模式的思想
装饰器模式主要组成部分:
Component:定义一个对象接口,可以给这些对象动态地添加职责
ConcreteComponent:定义一个对象,可以给这个对象添加一些职责
Decorator:维持一个指向Component的指针,并定义一个与Component接口一致的接口
ConcreteDecorator:负责向ConcreteComponent添加功能
在装饰模式中,Decorator定义了一个装饰接口类。因为Decorator与ConcreteComponent继承同一个接口,所以继承Decorator的类ConcreteDecorator可以使用ConcreteComponent的方法,再在ConcreteDecorator里面加入一些新的方法,也就是装饰,就成为了一个包装好的装饰类。
装饰器模式类图:

装饰者模式C#代码举例:
Component 对象类
/// <summary>
/// 对象类
/// </summary>
public abstract class Component
{
public abstract void Print();
}
ConcreteComponenet 类 对象的修饰实现类
public class ConcreteComponent:Component
{
/// <summary>
/// 对象修饰类
/// </summary> public override void Print()
{
Console.WriteLine("我是ConcreteComponent!");
}
}
Decorator类 装饰器类
/// <summary>
/// 装饰器类
/// </summary>
public class Decorator:Component
{
protected Component _component; public void SetComponent(Component component)
{
this._component = component;
}
public override void Print()
{
if (_component != null)
{
_component.Print();
}
}
}
ConcreteDecoratorA类 装饰子类A
/// <summary>
/// 装饰子类A
/// </summary>
public class ConcreteDecoratorA: Decorator
{
public override void Print()
{
base.Print();
Console.WriteLine("我是ConcreteDecoratorA!");
}
}
ConcreteDecoratorB 装饰子类B
/// <summary>
/// 装饰子类B
/// </summary>
public class ConcreteDecoratorB:Decorator
{
public override void Print()
{
base.Print();
Console.WriteLine("我是ConcreteDecoratorB!");
}
}
用户测试类:
class Client
{
static void Main(string[] args)
{
ConcreteComponent concreteComponent = new ConcreteComponent();
ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(); concreteDecoratorA.SetComponent(concreteComponent);
concreteDecoratorA.Print();
Console.WriteLine("--------------------------------");
concreteDecoratorB.SetComponent(concreteDecoratorA); concreteDecoratorB.Print();
Console.Read(); }
}
运行结果:

源代码工程文件下载
装饰者模式实际生活举例
举例说明
假设有一部手机你购买来以后只有手机,然后你需要再给其添加一些装饰,比如保护壳,钢化膜或者手机贴画等
mobilephone 原手机接口
/// <summary>
/// 手机接口
/// </summary>
public abstract class MobilePhone
{
public abstract void Print();
}
AppleMobilePhone类 手机的修饰类
/// <summary>
/// 手机的修饰
/// </summary>
public class AppleMobilePhone :MobilePhone
{
public override void Print()
{
Console.WriteLine("我是一部苹果手机!");
}
}
Decorator类 装饰器类
/// <summary>
/// 装饰器
/// </summary>
public class Decorator:MobilePhone
{
protected MobilePhone mobliePhone;
public void SetMobilePhone(MobilePhone phone)
{
this.mobliePhone = phone;
} public override void Print()
{
if (mobliePhone != null)
{
mobliePhone.Print();
}
}
}
MobilePhoneShell类 手机壳修饰类
/// <summary>
/// 手机壳修饰类
/// </summary>
public class MobilePhoneShell:Decorator
{
public override void Print()
{
base.Print();
Console.WriteLine("我是一个手机保护壳!");
}
}
MobilePhoneStickers类 手机贴画修饰类
/// <summary>
/// 手机贴画修饰类
/// </summary>
public class MobilePhoneStickers:Decorator
{
public override void Print()
{
base.Print();
Console.WriteLine("我是一个手机贴画!");
}
}
用户测试类
class Client
{
static void Main(string[] args)
{
Console.WriteLine("----------------手机-----------------");
AppleMobilePhone appleMobilePhone = new AppleMobilePhone();
appleMobilePhone.Print(); Console.WriteLine("---------加了手机壳的手机----------------");
MobilePhoneShell mobilePhoneShell = new MobilePhoneShell();
mobilePhoneShell.SetMobilePhone(appleMobilePhone);
mobilePhoneShell.Print(); Console.WriteLine("----------加了手机贴画的手机---------------");
MobilePhoneStickers mobilePhoneStickers = new MobilePhoneStickers();
mobilePhoneStickers.SetMobilePhone(appleMobilePhone);
mobilePhoneStickers.Print();
Console.WriteLine("----------既加了手机壳又加了手机贴画的手机--------"); mobilePhoneStickers.SetMobilePhone(mobilePhoneShell);
mobilePhoneStickers.Print(); Console.Read(); }
}
运行结果

源代码工程文件下载地址
C#设计模式--装饰器模式的更多相关文章
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 从ES6重新认识JavaScript设计模式: 装饰器模式
1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...
- C#设计模式-装饰器模式(Decorator Pattern)
引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- php设计模式 装饰器模式
装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...
- 说说设计模式~装饰器模式(Decorator)
返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...
- Java设计模式--装饰器模式到Java IO 流
装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...
- Groovy 设计模式 -- 装饰器模式
http://groovy-lang.org/design-patterns.html#_chain_of_responsibility_pattern 装饰器模式, 起到美化原始对象的作用. 一个被 ...
随机推荐
- Winform控件学习笔记【第二天】——常用控件
背景:期末考试刚过就感冒了,嗓子火辣辣的,好难受.但是一想起要学习总结就打起精神来了,Winform控件网上也没有多少使用教程,大部分都是自己在网上零零散散的学的,大部分用的熟了,不总结会很容易忘得. ...
- asp.net Core EF core ( Entity Framework 7 ) 数据库更新维护
CreateDatabaseIfNotExists等之前的API已经废弃,现在采用的是微软封装好,简化.高效的API,migrations 因为,旧API,要付出高昂的代价,以及局限性 打开VS20 ...
- perl 安装Image::Magick 模块
ImageMagick 是一个处理图片的库,有C, perl, python, java 等多种语言对应的库 在安装perl 对应的Image::Magick 模块之前,首先需要安装 ImgeMagi ...
- CentOS 7系统查看系统版本和机器位数
前言 由于不经常使用linux,每当使用的时候就是安装软件,安装软件的时候就要选择安装包平台,是32位的还是64位的.这时候突然发现不知道怎么查,于是百度.虽然轻而易举百度出来,但仍旧没有自己的笔记看 ...
- [Learn AF3]第一章 如何使用App Framework 3.0 构造应用程序
af3的变化非常大.参见[译]Intel App Framework 3.0的变化 一.应用需要引用的js脚本: af3中不在自己实现dom选择器,而是选择基于jquey或兼容jquery的库如zep ...
- 关于golang中包(package)的二三事儿
golang的package和其他语言的组织方式完全不同,刚开始接触时,很不适应. golang的package的特点: 1.go的package不局限于一个文件,可以由多个文件组成. 组成一个pac ...
- UNIX环境编程学习笔记(28)——多线程编程(三):线程的取消
lienhua342014-11-24 1 取消线程 pthread 提供了pthread_cancel 函数用于请求取消同一进程中的其他线程. #include <pthread.h> ...
- 主调度器schedule
中断处理完毕后,系统有三种执行流向: 1)直 ...
- 简要介绍DES、RSA MD5 sha1 四种加密算法的优缺点,以及使用场合
美国数据加密标准(DES)是对称密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立.密钥较短,加密处理简单,加解密速度快,适用于加密大量数据的场合.RSA是非对称算法,加密密钥和解密密钥是不 ...
- Linux less 常用导航命令
linux中经常用less来查看文件,文件较短的时候用pgup(pageup), pgdn(pagedown),↑,↓几个键够,但是当文件比较长的时候用一些快捷键就能很方便实现快速导航. 1. 按匹配 ...