博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之六(装饰模式)
阅读量:5260 次
发布时间:2019-06-14

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

前言

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

装饰模式结构图

 

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

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

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

代码实现

Component类

public abstract class Component    {        public abstract void Operation();    }

ConcreteComponnet类

public class ConcreteComponent : Component    {        public override void Operation()        {            Console.WriteLine("具体对象的操作");        }    }

Decorator类

public abstract class Decorator : Component    {        protected Component component;        ///         /// 设置Component        ///         ///         public void SetComponent(Component component)        {            this.component = component;        }        ///         /// 重写Operation,实际执行的是Component的Operation        ///         public override void Operation()        {            if (component != null)            {                component.Operation();            }        }    }

ConcreteDecoratorA

public class ConcreteDecoratorA : Decorator    {        ///         /// 本类独有功能,以区别于ConcreteDecoratorB        ///         private string AddedState;        public override void Operation()        {            base.Operation();            AddedState = "NewState";            Console.WriteLine("具体装饰对象A的操作");        }    }

ConcreteDecoratprB

public class ConcreteDecoratorB : Decorator    {        public override void Operation()        {            base.Operation();        }        ///         /// 本类独有的方法,以区别于ConcreteDecoratorA        ///         private void AddedBehavior()        {             ///        }    }

客户端调用实例

public class Program    {        static void Main(string[] args)        {            ConcreteComponent cc = new ConcreteComponent();            ConcreteDecoratorA ca = new ConcreteDecoratorA();            ConcreteDecoratorB cb = new ConcreteDecoratorB();            ca.SetComponent(cc);            cb.SetComponent(ca);            cb.Operation();            Console.ReadLine();        }    }

装饰的方式是:首先用ConcreteComponent实例化cc,然后用ConcreteComponentA的实例化对象ca来包装cc,再用ConcreteComponetB的对象cb包装ca,最终执行cb的Operation()

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

 

不过也有特殊情况:如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没必要建立单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。

总结

 装饰模式就是为已有功能动态添加更多功能的一种方式。

优点可以这样说:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了。

 

转载于:https://www.cnblogs.com/aehyok/archive/2013/05/30/3107435.html

你可能感兴趣的文章
Codeforces Round #306 (Div. 2) A
查看>>
161017、SQL必备知识点
查看>>
hdu 1541Stars
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
C# GC 垃圾回收机制
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
使用Git、Git GUI和TortoiseGit
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
阴影:box_shadow
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
asp.net的图片、文件上传
查看>>
常用正则
查看>>
Android网络之数据解析----使用Google Gson解析Json数据
查看>>
Python之类
查看>>