IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> C#:设计模式之装饰者模式 -> 正文阅读

[开发测试]C#:设计模式之装饰者模式

? ? ? ?如果想给一个对象增加功能怎么办?一般做法是继承这个父类生成一个子类,在父类的功能基础上进行扩展,这样虽然实现了增加功能的需求,但是如果这个类已定义为不能继承(如被sealed关键字修饰)就不能实现以上要求,而且过于复杂的继承关系不利于系统的扩展和维护,那么有没有类似的方法不利用继承就可以实现扩展对象的功能呢?? ?

? ? ? ?装饰者模式使用对象之间的关联关系取代继承关系,动态的给对象增加、删除职责,装饰着模式降低了系统的耦合度,实现了开闭原则。装饰者模式的定义如下:动态的给对象增加一些额外的职责,就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。

装饰模式的结构:? ? ?

? ? ? ? 装饰模式包含四个角色:

1.component(抽象构件):声明构件和装饰类的公用接口。即给出一个抽象接口,已规范准备接收附加责任的对象

2.ConcreteComponent(具体构件):抽象构件类的子类。 它定义了基础行为, 但装饰类可以改变这些行为。

3.Decorator(抽象装饰类):抽象构件类的子类。 它定义了基础行为, 但装饰类可以改变这些行为。

4.ConcreteComponent(装饰类):抽象装饰类的子类,负责向构件添加新的职责,每一个都定义了新行为,既可以调用抽象装饰类的方法,也可以调用定义的新方法。

结构图:

?具体实现:

抽象构件: 声明了一些抽象业务

?具体构件:实现了抽象构件的的业务,通常在具体构件类中只是声明一些基本功能,而一些复杂的扩展功能将在装饰类中实现。

?抽象装饰类:装饰模式的核心将在抽象装饰类的设计,它维持了一个对抽象构件对象的引用,注入了抽象构件类型的对象,维持类原有的业务方法。抽象装饰类没有真正实现装饰,而是提供了一个统一的接口,将具体装饰功能交给子类完成。

具体装饰类:既可以调用抽象装饰类的方法,也可以定义新的业务方法。?

? ? ? ? ?由于在 抽象装饰类Decorator中注入的是Component类型的接口,因此可以将一个具体构件对象注入其中,再通过具体装饰类进行修饰。此外,还可以将一个已经装饰过的Decorator子类的对象再注入其中进行多次装饰,从而实现原有功能的多次扩展。

? ? ? ? ?再定义一个具体装饰类,继续扩展功能:?

? ? ? ??继续装饰:

? ? ? ? 装饰类的调用:

? ? ? ? ?在component被ConcreteDecorator装饰了一次之后,又被ConcreteDecoratorMore和ConcreteDecoratorMoreAndMore两个装饰类进行了第二次和第三次装饰,在运行结果中可以看到,component对象的业务方法通过具体装饰类的装饰得到了不断的扩展,如果需要增加新的业务方法,只需要增加对应的具体装饰类即可,符合开闭原则。

总结:

装饰模式的优缺点:

? ? ? ?优点:从为对象添加功能的角度来看,装饰者模式比继承更为灵活。装饰者模式采用把功能分离到每个装饰器当中,通过对象组合的方式,在运行时动态的组合使装饰对象最终具有想要的功能组合。

? ? ? ?缺点:装饰模式把一系列复杂的功能分散到每个装饰器中,一般情况下每个装饰器只实现一个功能,这样会产生很多细粒度的对象,并且功能越复杂,细粒度对象越多。

使用场合:

? ? ? ?1.如果需要再不影响其他对象的情况下,以动态、透明的方式给对象增加职责,可以使用装饰者模式。

? ? ? ?2. 如果不适合使用子类进行扩展的时候,可以考虑使用装饰者模式。装饰者模式使用的是对象组合的方式。

不卑不亢,天天向上——阿睿

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:26:55  更:2021-09-06 11:27:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:19:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码