一、概念:

  动态的给一个对象添加一些额外的职责,就增加的功能来说,装饰模式比生成子类更为灵活。【DP】

二、通俗的理解:

  装饰模式是利用其中的方法为来对对象进行包装的,这样每个包装对象的事项就和如何使用这个对象分离了,

每个对象只关心自己的功能,不需要关心如何添加到对象链中去。

三、模式类图

                               

四、对类图的解释;

Component是定义一个对象接口,可以给这些对象动态的添加职责,ConcreateComponent是定义了一个具体的对象,

也可以给这个对象添加 一些职责。Decorator,装饰抽象类,继承了Componet,从外类来扩展Component类的功能,

但对于Component来说,是无需知道Descorator的存在的。至于ConcreteDescorator就是具体的装饰对象,起到给Component添加职责的功能。

五、类图代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Decorator
{
//Component类; public abstract class Component
{
public abstract void Operation(); //定义的接口中的实现方法
} public class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具体对象的实现操作");
}
} public class Decorator : Component
{
protected Component component; public void SetComponent(Component component)
{
//设置Component
this.component = component;
} public override void Operation()
//重写Operation(),实际是执行的是Component的Operation()
{
if (component != null)
{
component.Operation();
}
}
} public class ConcreteDecoratorA : Decorator
{
public override void Operation()
{
base.Operation(); //关键的一步
SubedBehavior();
Console.WriteLine("具体装饰对象A的操作");
}
public void SubedBehavior()
{
//用来区别ConcreateDecoratorA和 ConcreateDecoratorB的区别
}
} public class ConcreteDecoratorB : Decorator
{ public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作");
}
public void AddedBehavior()
{
//用来区别ConcreateDecoratorA和 ConcreateDecoratorB的区别
}
} //客户端代码的实现;
class Program
{
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB(); d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
//装饰的方法是:首先用ConcreteComponent实例话对象c,然后用ConcreteDecorateA的实例化对象d1来包装c,在用ConcreteDecoratorB的对象d2来包装d1,最终执行d2的Operation() Console.ReadKey();
}
} }

六、结果显示

                                

七、案例的使用:

在生活中我们时刻个电脑打交道,那么电脑就是我们补课或缺的一部分,那么我们肯定会给电脑进行添加东西,进行装饰了,

有外观上的装饰,同样也有内在的性能改变,这就用到了装饰模式了。对于电脑我们可以以性能的装饰来进行实例的演习。

性能中,我们可以加固态硬盘、内存条等。那么进行演示:

代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Test_01
{ public abstract class Computer
{
public abstract void Show();
} public class HPComputer:Computer
{
public override void Show()
{
Console.WriteLine("以下是对惠普电脑的一系列操作");
}
} public class Decorator:Computer
{
protected Computer computer; public void SetCompueter(Computer computer)
{
this.computer = computer;
} public override void Show()
{
if(computer!=null)
{
computer.Show();
}
}
} public class SSD:Decorator
{
public override void Show()
{
base.Show();
Console.WriteLine("我的电脑加装了固态硬盘");
}
} public class Memory : Decorator
{
public override void Show()
{
base.Show();
Console.WriteLine("我的电脑加装了内存条");
}
} class Program
{
static void Main(string[] args)
{
HPComputer decorator = new HPComputer();
SSD ssd = new SSD();
Memory memory = new Memory(); ssd.SetCompueter(decorator);
memory.SetCompueter(ssd);
memory.Show();
Console.ReadKey();
}
}
}

运行结果

                              

八、结语:到底在什么地方使用装饰模式

当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为。

装饰模式是提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个类包装他所要装饰的对象,因此当需要执行特殊操作行为时,

客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能 包装对象了【DP】

优点

           1、装饰者模式比继承更灵活

           2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

           3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。        

缺点

           1、会产生很多小对象,增加了系统的复杂性。

           2、更加易于出错,排错也很困难,较为烦琐。

03、装饰模式(Decorator)的更多相关文章

  1. 装饰模式/decorator模式/结构型模式

    装饰模式Decorator 定义 为对象动态的增加新的功能,实现要求装饰对象和被装饰对象实现同一接口或抽象类,装饰对象持有被装饰对象的实例. java实现要点 定义一个接口或抽象类,作为被装饰者的抽象 ...

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

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

  3. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  4. 设计模式 装饰模式(Decorator)

    设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...

  5. 设计模式-装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

  6. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...

  7. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  8. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 装饰模式 - Decorator 和 外观模式 - Facade

    装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:

  10. [工作中的设计模式]装饰模式decorator

    一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...

随机推荐

  1. Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266或DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()

    使用QMediaPlayer和QVideoWidget QHBoxLayout *m_layout=newQHBoxLayout(this); QMediaPlayer *m_player = new ...

  2. golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的

    golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...

  3. affine_trans_pixel 和 affine_trans_point_2d的区别

    affine_trans_pixel 和 affine_trans_point_2d的不同在于所使用的坐标系原点不同,affine_trans_pixel 使用的是像素坐标系, 即原点位于图像的左上角 ...

  4. 利用Python调用pastebin.com API自动创建paste

    在上一篇文章中,已经实现了模拟pastebin.com的账号登录,并且获取了api_dev_key,这一篇文章主要讲一下调用API创建paste 登录之后,进入API页面,发现网站已经提供了几个API ...

  5. 基本运算符,流程控制if、while

    基本运算符 算术运算符 运算符 描述 实例 + 加 a + b - 减 a - b * 乘 a * b / 除 a / b % 取余 a % b // 整除 a // b ** 幂运算 a ** b ...

  6. 10. [mmc subsystem] host(第四章)——host实例(sdhci-msm说明)

    一.说明 sdhci-msm是指高通的mmc host,其使用了标准SDHC标准.故可以使用前面说的<host(第二章)--sdhci>和<host(第三章)--sdhci-pltf ...

  7. 函数arguments讲解

         // 总结:1- 函数内部有一个实参 arguments 可以获取所有的实参.      //2- arguments是一个伪数组,如果要使用数组的方法, 将它转为真数组      // 3 ...

  8. 第 33课 C++中的字符串(上)

    历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串.C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同 ...

  9. 201871010105-曹玉中《面向对象程序设计(java)》第十一周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十一周学习总结 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/ ...

  10. Ubuntu下apache2安装配置(内含数字证书配置)

    Ubuntu下apache2安装配置(内含数字证书配置)安装命令:sudo apt-get updatesudo apt-get install apache2 配置1.查看apache2安装目录命令 ...