装饰模式就是在程序运行的过程中,动态地增加一些功能!(这里面包括的原理是,1、原程序不需要改变,2、运行时增加(其实就像AOP面向切面编程)),这样的功能是非常有用的。
试想一下,很多程序在编写的时候,你根本不知道对像该如何组装。类型打LOL游戏的装备一下,用户要买什么样的装备呢?你在开发的时候并不知情。需要在游戏由用户根据需要动态地增加减少。
如何来做:
1、需要定义抽像接口(连通角色和装备,它们都需要继承)
public abstract class HeroBase { public abstract void Show(); }
2、角色:
/// <summary> /// 泰达米尔,蛮子 /// </summary> public class Tryndamere : HeroBase { public override void Show() { Console.WriteLine("梦STORY(蛮王)"); } }
3、装饰者:
public class DecoratorBase : HeroBase { /// <summary> /// 关键点在于这个临时变量 /// </summary> HeroBase Herobase; public DecoratorBase(HeroBase herobase) { Herobase = herobase; } /// <summary> /// 每装饰一次,都要为 herobase 增加一个这样的 SHOW方法 /// </summary> public override void Show() { Herobase.Show(); Console.Write("买_"); } }
4、实现者(装备):
public class 最后的轻语 : DecoratorBase { public 最后的轻语(HeroBase herobase) : base(herobase) { } /// <summary> /// 每装饰一次,都要为 herobase 增加一个这样的 SHOW方法 /// </summary> public override void Show() { base.Show(); Console.WriteLine("最后的轻语"); } }
5、使用:(不论你是瑞文还是蛮王,都很容易地改变装备,运行中由用户自己决定装备,这样的灵活性就是装饰模式要解决的问题。)
static void Main(string[] args) { ////蛮王 // HeroBase tryndamere = new Tryndamere(); //tryndamere.Show(); ///瑞文 HeroBase tryndamere = new Raven(); tryndamere = new 斯塔缇克电刃(tryndamere); tryndamere = new 无尽之刃(tryndamere); tryndamere = new 破败王者之刃(tryndamere); tryndamere = new 幻影之舞(tryndamere); tryndamere = new 最后的轻语(tryndamere); tryndamere = new 狂战士胫甲(tryndamere); tryndamere.Show(); Console.Read(); }
结果:
写的最详细的参考文档:
http://baike.baidu.com/link?url=JtMOO9sYnc0d9xoJwpKgSWhfmjlRqJctptvI2MwcNM4_wK61nP4qRO42o1QrntS4kR_R2ysOse-DZ4FK2HsDHa