博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Net设计模式实例之装饰者模式(Decorator Pattern)(1)
阅读量:5847 次
发布时间:2019-06-19

本文共 2079 字,大约阅读时间需要 6 分钟。

duction

动态地给一个对象添加一些额外的职责。
优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。
 

已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承。
比如,刚买一辆汽车如下图
此汽车不符合你的个性要求,比如外表不够美观,发动机马力不足,不能满足你的速度激情,于是你需要对汽车的外表进行装饰,同时需要提高发动机的性能。这些操作通过装饰模式就能很好地解决问题。最终得到如下图所示的个性汽车。

、装饰模式结构

Component
定义了一个对象接口,可以给这些对象动态地添加职责。
ComcreteComponent
定了一个具体的对象,也可以给这个具体的对象添加职责。
Decorator
抽象装饰类,继承了
Component
对象接口,从外类扩展
Component
类的功能,但对于
Component
来说,是无需知道
Decorator
的存在。
ConcreteDecoratorA
具体的装饰对象,起到给
Component
添加职责的功能。
ConcreteDecoratorB
具体的装饰对象,起到给
Component
添加职责的功能。

、源代码

1
、对象接口
Component.cs
public
 abstract class Component
{
    public abstract void
 Operation();
}
 
2
、实现类
ConcreteComponent
.cs 
继承于
Component
接口
public
 class ConcreteComponent
 : Component
{
    
public
 override void
 Operation()
    
{
        Console
.WriteLine("
开始执行具体的对象..."
);
    
}
}
 
3
、装饰抽象类
Decorator.cs 
继承于
Component
接口
public
 abstract class Decorator
 : Component
{
    
private
 Component
 m_Component;
 
    
public
 void
 SetComponent(Component
 component)
    
{
        
this
.m_Component = component;
    
}
 
    public override void
 Operation()
    
{
        if
 (m_Component != null
)
       
{
            
m_Component.Operation();
       
}
    
}
}
 
4
、具体的装饰对象
ConcreteDecoratorA.cs 
继承于
Decorator
抽象类
public
 class ConcreteDecoratorA
 : Decorator
{
    private string
 addedState;
    public override void
 Operation()
    
{
        base
.Operation();
        
addedState = "
进行了状态属性装饰。"
;
        Console
.WriteLine(addedState);
    
}
}
给对象接口
Component
添加了状态属性
addedState
 
5
、具体的装饰对象
ConcreteDecoratorB.cs 
继承于
Decorator
抽象类
public
 class ConcreteDecoratorB
 : Decorator
{
    public override void
 Operation()
    
{
        base
.Operation();
        
AddedBehavior();
    
}
 
    private void
 AddedBehavior()
    
{
        Console
.WriteLine("
进行了操作行为装饰。"
);
    
}
}
 
 
给对象接口
Component
添加了操作行为
AddedBehavior()
 
5
、客户端代码
static
 void Main
(string
[] args)
{
    ConcreteComponent
 cc = new ConcreteComponent
();
    ConcreteDecoratorA
 cda = new ConcreteDecoratorA
();
    ConcreteDecoratorB
 cdb = new ConcreteDecoratorB
();
 
    
cda.SetComponent(cc);
    
cdb.SetComponent(cda);
    
cdb.Operation();
    Console
.Read();
}
给对象接口
Component
添加了操作行为
AddedBehavior()

、程序运行结果

本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/268098,如需转载请自行联系原作者
你可能感兴趣的文章
(转)关于TCP封包、粘包、半包
查看>>
[z]如何在一台windows主机上安装多个mysql服务
查看>>
wordpress主题制作常用基本的模板及说明
查看>>
cocos2d-x学习日志(10) --射击游戏(喵星战争)
查看>>
乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
查看>>
轻量级router[类似laravel router]
查看>>
在android创建bitmap避免低记忆法
查看>>
php 数组排序
查看>>
CPLD/FPGA基础知识(一)——FPGA的结构
查看>>
WPF快速精通版
查看>>
eclipse下遇到 无法解析类型 javax.servlet.http.HttpServletRequest
查看>>
jboss5优化
查看>>
北风网VIP6级学习视频地址
查看>>
PHP基础之 file_get_contents() 函数
查看>>
用platformio编写arduino程序
查看>>
InnoDB主键设计
查看>>
JS阻止链接跳转代码
查看>>
存储过程语法
查看>>
tomcat 内存大小配置
查看>>
微信小程序 - 拨打电话
查看>>