博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰模式
阅读量:5078 次
发布时间:2019-06-12

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

前言

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

一、Component抽象类

1     public abstract class Component2     {3         public abstract void Operationa();4     }

  Component 定义一个对象接口,可以给这些对象动态地添加职责

二、ConcreteComponent具体对象类

1     public class ConcreteComponent : Component2     {3         public override void Operationa()4         {5             Console.WriteLine("具体对象的操作");6         }7     }

  ConcreteComponent 定义了一个具体的对象,也可以给这个对象添加一些职责

三、Decorator装饰抽象类 

1 { 2     abstract class Decorator : Component 3     { 4         protected Component component; 5  6         public void SetComponent(Component component) 7         { 8             this.component = component; 9         }10         public override void Operationa()11         {12             if(component != null)13             {14                 component.Operationa();15             }16         }17     }

  Decorator装饰抽象类,继承Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的

四、ConcreteDecorator具体的装饰对象

1     class ConcreteDecoratorA : Decorator 2     { 3         private string addedState; 4         public override void Operationa() 5         { 6             base.Operationa(); 7             addedState = "A New State"; 8             Console.WriteLine("具体装饰对象A的操作"); 9         }10     }11     class ConcreteDecoratorB : Decorator12     {13         public override void Operationa()14         {15             base.Operationa();16             AddedBehavior();17             Console.WriteLine("具体装饰对象B的操作");18         }19 20         private void AddedBehavior()21         {22             //Console.WriteLine("B New State");23         }24     }

  ConcreteDecorator具体的装饰对象,起到给Component添加职责的功能。

五、运行

  

1     class Program 2     { 3         static void Main(string[] args) 4         { 5             ConcreteComponent c = new ConcreteComponent(); 6             ConcreteDecoratorA a = new ConcreteDecoratorA(); 7             ConcreteDecoratorB b = new ConcreteDecoratorB(); 8  9             c.Operationa();10             Console.WriteLine("===================");11             a.SetComponent(c);12             a.Operationa();13             Console.WriteLine("===================");14             b.SetComponent(a);15             b.Operationa();16 17             Console.ReadKey();18         }19     }

  显示结果:

具体对象的操作===================具体对象的操作具体装饰对象A的操作===================具体对象的操作具体装饰对象A的操作具体装饰对象B的操作

 

总结:

  1、装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

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

  在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中。

  因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。

  3、优点:把类中的装饰功能从类中移除,这样可以简化原有类。这样可以有效地把类的核心职责和装饰功能分开,而且可以去除相关类中的重复装饰逻辑。  

 

  参考书籍:大话设计模式

转载于:https://www.cnblogs.com/hyunbar/p/9835574.html

你可能感兴趣的文章
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>