无废话C#设计模式的十.pdf
无废话C#设计模式的十 3:Decorator 疯狂代码 http:/CrazyC 意图 动态地给个对象添加些额外职责就增加功能来说Decorator模式相比生成子类更为灵活 场景 在设计网络游戏武器系统时开始并没有考虑到武器强化和磨损的后策划人员说希望给游戏增加强化系统和修理系统那么我们武器类型就需要对外提供强化、磨损、修理等思路方法了发生这种改动是我们最不愿意看到按照设计原则我们希望功能扩展尽可能不要修改原来你可能会想到使用继承来实现但是策划人员需求是有武器能磨损能修理不能强化有武器能强化但是不会磨损有武器既能强化还能磨损和修理遇到这样情况继承方案可能不适合了来继承层次可能会很多 2来子类数量可能会很多 由此引入装饰模式来解决这个问题装饰模式使得我们能灵活赋予类额外职责并且使得设计和继承相比更合理 举例代码 以下是引用片段:using;using.Collections.Generic;using.Text;DecoratorExample Program voidMain(args)Weaponw=Rle;w.ShowInfo;EnhanceenhancedWeapon=Enhance(w);enhancedWeapon.EnhanceAmmo;enhancedWeapon.ShowInfo;WearwornWeapon=Wear(w);wornWeapon.WearByRate(0.8);wornWeapon.ShowInfo;abstractWeapon privatedoubleammo;publicdoubleAmmo getammo;ammo=value;privatedoubleattack;publicdoubleAttack getattack;attack=value;privatedoublespeed;publicdoubleSpeed getspeed;speed=value;privatename;publicName getname;name=value;publicabstractvoidShowInfo;Rle:Weapon publicRle this.Ammo=100;this.Attack=10;this.Speed=5;this.Name=Rle;publicoverridevoidShowInfo Console.WriteLine(.Format(ammot0,Ammo);Console.WriteLine(.Format(attackt0,Attack);Console.WriteLine(.Format(speedt0,Speed);Console.WriteLine(.Format(namet0,Name);abstractDecorator:Weapon protectedWeaponw;publicDecorator(Weaponw)this.w=w;publicoverridevoidShowInfo w.ShowInfo;Enhance:Decorator publicEnhance(Weaponw):base(w)publicvoidEnhanceAmmo w.Ammo20;Console.WriteLine(Enhanced);Wear:Decorator publicWear(Weaponw):base(w)publicvoidWearByRate(doublerate)w.Speed=w.Speed*rate;w.Attack=w.Attack*rate;Console.WriteLine(Worn);代码执行结果如下图:代码介绍说明 Weapon是抽象构件角色 Rle是具体构件角色实现抽象构件接口 Decorator是装饰角色装饰角色有两个特点是继承了抽象构件接口 2是有个构件角色例子 Enhance和Wear是具体装饰角色它们负责给构件附加责任 客户端在使用装饰角色时候并没有针对抽象构件进行编程我们确实需要使用具体装饰角色提供额外思路方法这种类型装饰叫做半透明装饰 何时采用 从代码角度来说如果你觉得由于功能交叉扩展不会导致非常多子类或者非常多继承层次话可以考虑装饰模式 从应用角度来说如果你希望动态给类赋予或撤销些职责并且可以任意排列组合这些职责话可以使用装饰模式 实现要点 让装饰角色还继承抽象构件角色也是装饰模式最大特点目就是给抽象构件增加职责对外表现为装饰后构件 让装饰角色拥有构件角色例子目就是让构件能被多个装饰对象来装饰 在具体应用中可以灵活点不定要有抽象构件和装饰角色但是装饰对象继承装饰对象并且拥有它例子两大特点需要体现 透明装饰般通过在基类思路方法前后进行扩充实现半透明装饰般通过新接口实现 注意事项 装饰模式和桥接模式区别是前者是针对功能扩展本质上还是样东西而后者针对多维护变化装饰模式思想在于扩展接口而桥接模式思想是分离接口 装饰类可能会比较琐碎并且不利于复用装饰模式在增加了灵活性同时也降低了封装度在实际应用中可以和其它模式配合 2009-1-9 15:48:56 疯狂代码 http:/CrazyC