论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
【23种设计模式】装饰模式(九)
【23种设计模式】装饰模式(九)
兜兜零元
金牌会员
|
2023-9-13 19:46:19
|
显示全部楼层
|
阅读模式
楼主
主题
865
|
帖子
865
|
积分
2595
前言
装饰模式
,英文名称:Decorator Pattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧,大家一定要看清楚,是“装修”,不是“装饰”。在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系统中,要给某个类型或者对象增加功能,如果使用“继承”的方案来写代码,就会出现子类暴涨的情况。比如:IMarbleStyle是大理石风格的一个功能,IKeepWarm是保温的一个接口定义,IHouseSecurity是房子安全的一个接口,就三个接口来说,House是我们房子,我们的房子要什么功能就实现什么接口,如果房子要的是复合功能,接口不同的组合就有不同的结果,这样就导致我们子类膨胀严重,如果需要在增加功能,子类会成指数增长。
装饰模式的定义
上述的问题的根源在于我们
“过度地使用了继承来扩展对象的功能”
,由于继承为类型引入的静态特质,所谓静态特质,就是说如果想要某种功能,我们必须在编译的时候就要定义这个类,这也是强类型语言的特点。静态,就是指在编译的时候要确定的东西;动态,是指运行时确定的东西。使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。如何使“对象功能的扩展”能够根据需要来动态(即运行时)地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响降为最低?装饰者模式解决此问题应运而生,动态地给一个对象增加一些额外的职责。
装饰模式的组成
抽象构件角色(Component)
:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件角色(Concrete Component)
:定义一个将要接收附加责任的类。
装饰角色(Decorator)
:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
具体装饰角色(Concrete Decorator)
:负责给构件对象添加上附加的责任。
装饰模式的实现
以装修房子为例,完成装饰着模式的代码实现
房子定义
/// <summary>
/// 该抽象类就是房子抽象接口的定义,该类型就相当于是Component类型,是饺子馅,需要装饰的,需要包装的
/// </summary>
public abstract class House
{
/// <summary>
/// 房子的装修方法--该操作相当于Component类型的Operation方法
/// </summary>
public abstract void Renovation();
}
/// <summary>
/// MyHouse的房子,我要按我的要求做房子,相当于ConcreteComponent类型
/// </summary>
public sealed class MyHouse : House
{
public override void Renovation()
{
Console.WriteLine("装修我的房子");
}
}
复制代码
装饰类的定义
/// <summary>
/// 该抽象类就是装饰接口的定义,该类型就相当于是Decorator类型,如果需要具体的功能,可以子类化该类型
/// </summary>
public abstract class DecorationStrategy : House //关键点之二,体现关系为Is-a,有了这个关系,装饰的类也可以继续装饰了
{
//通过组合方式引用Decorator类型,该类型实施具体功能的增加
//这是关键点之一,包含关系,体现为Has-a
protected House _house;
//通过构造器注入,初始化平台实现
protected DecorationStrategy(House house)
{
this._house = house;
}
//该方法就相当于Decorator类型的Operation方法
public override void Renovation()
{
if (this._house != null)
{
this._house.Renovation();
}
}
}
复制代码
安全需求类装饰定义
/// <summary>
/// 具有安全功能的设备,可以提供监视和报警功能,相当于ConcreteDecoratorA类型
/// </summary>
public sealed class HouseSecurityDecorator : DecorationStrategy
{
public HouseSecurityDecorator(House house) : base(house) { }
public override void Renovation()
{
base.Renovation();
Console.WriteLine("增加安全系统");
}
}
复制代码
保暖需求类装饰定义
/// <summary>
/// 具有保温接口的材料,提供保温功能,相当于ConcreteDecoratorB类型
/// </summary>
public sealed class KeepWarmDecorator : DecorationStrategy
{
public KeepWarmDecorator(House house) : base(house) { }
public override void Renovation()
{
base.Renovation();
Console.WriteLine("增加保温的功能");
}
}
复制代码
调用
public void RunTest()
{
//这就是我们需要装饰的房子
House myselfHouse = new MyHouse();
DecorationStrategy securityHouse = new HouseSecurityDecorator(myselfHouse);
securityHouse.Renovation();
/*
* 此时房子就有了安全系统了.....
*/
//【1】如果我既要安全系统又要保暖呢,继续装饰就行
//DecorationStrategy securityAndWarmHouse = new KeepWarmDecorator(myselfHouse);
//securityAndWarmHouse.Renovation();
Console.WriteLine("\r\n*****************************\r\n");
//【2】如果我既要安全系统又要保暖呢,继续装饰就行【和上边的进行运行比对】
//【对运行结果难理解的话,打断点单步执行进行理解】
DecorationStrategy securityAndWarmHouse1 = new KeepWarmDecorator(securityHouse);
securityAndWarmHouse1.Renovation();
}
复制代码
装饰模式的优缺点
优点
把抽象接口与其实现解耦。
抽象和实现可以独立扩展,不会影响到对方。
实现细节对客户透明,对用户隐藏了具体实现细节。
缺点
增加了系统的复杂度
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
兜兜零元
金牌会员
这个人很懒什么都没写!
楼主热帖
Oracle调度器Scheduler
clang-format的使用
数据库的建立、增、删、改、查 ...
深入解析kubernetes中的选举机制 ...
【黄啊码】MySQL入门—4、掌握这些数据 ...
MySQL安装配置
2万多条健康网站文章大全ACCESS\EXCEL ...
【黄啊码】MySQL入门—5、数据库小技巧 ...
看问题和做事情
V Rising 服务器搭建
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表