0.C#设计模式-简单工厂模式

1.C#设计模式--工厂方法模式

2.C#设计模式--抽象工厂模式

3.C#设计模式--单例模式

4.C#设计模式--建造者模式

5.C#设计模式--原型模式

6.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#设计模式--装饰器模式的更多相关文章

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

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  2. 从ES6重新认识JavaScript设计模式: 装饰器模式

    1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...

  3. C#设计模式-装饰器模式(Decorator Pattern)

    引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...

  4. 设计模式-装饰器模式(Decrator Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...

  5. php设计模式 装饰器模式

    装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...

  6. 说说设计模式~装饰器模式(Decorator)

    返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...

  7. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  8. Java设计模式--装饰器模式到Java IO 流

    装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...

  9. Groovy 设计模式 -- 装饰器模式

    http://groovy-lang.org/design-patterns.html#_chain_of_responsibility_pattern 装饰器模式, 起到美化原始对象的作用. 一个被 ...

随机推荐

  1. CI框架伪静态化配置

    CI框架伪静态化配置 伪静态化,即:去掉入口的index.php, 在url后面加上 .html 后缀 CI默认的rewrite url中是类似这样的,例如你的CI根目录是在/CodeIgniter/ ...

  2. MySql:charset和collation的设置

    From: http://www.2cto.com/database/201302/189920.html MySql:charset和collation的设置   charset 和 collati ...

  3. HTML5 Canvas火焰效果 像火球发射一样

    Canvas是HTML5中非常重要而且有用的东西,我们可以在Canvas上绘制任意的元素,就像你制作Flash一样.今天我们就在Canvas上来制作一款火焰发射的效果.就像古代的火球炮一样,而且可以在 ...

  4. Material Design Support 8大控件介绍

    TextInputLayout 显示提示信息 能够通过调用setError()在EditText以下显示一条错误信息 FloatingActionButton 悬浮操作按钮 Snackbar 相当于底 ...

  5. spark LinearRegression 预测缺失字段的值

    最近在做金融科技建模的时候,字段里面很多缺少值得时候,模型对于新用户的预测会出现很大的不稳定,即PSI较大的情况. 虽然我们依据字段IV值得大小不断的在调整字段且开发新变量,但是很多IV值很大的字段直 ...

  6. ARC介绍

    从Ray Wenderlich的教程中截取了一小段作为对objective c中ARC的介绍,讲得比较清晰,原文有丰富的例子,见此 它是怎么工作的 你大概已经熟悉如何手工管理内存了, 就像这样:如果你 ...

  7. [MVC] 自定义ActionSelector,根据参数选择Action

    很多时候我们会根据UI传入的参数,呈现不同的View.也就是对于同一个Action如何根据请求数据返回不同的View.通常情况下我们会按照如下方法来写,例如: [AcceptVerbs(HttpVer ...

  8. Windows上使用sqlite3

    安装 去官网http://www.sqlite.org/download.html下载Windows下安装包,下载后,解压,设置环境变量 例如放在D:\sqlite3下,将D:\sqlite3加入环境 ...

  9. Tensorflow同时加载使用多个模型

    在Tensorflow中,所有操作对象都包装到相应的Session中的,所以想要使用不同的模型就需要将这些模型加载到不同的Session中并在使用的时候申明是哪个Session,从而避免由于Sessi ...

  10. zookeeper安装和dubbo-admin使用

    简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...