手机版

的装饰器模式 网络设计模式

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

导言:

动态地给对象添加一些额外的职责。就添加功能而言,装饰器模式比生成子类更灵活。

结构图:

优点:

装饰类和装饰类可以独立发展,不会相互耦合;动态扩展对象的功能;你可以多次装饰一个物体,让它有更多的功能;缺点:

多层装修复杂,相应增加了调试维护成本;会产生很多小对象,必然会占用很多系统资源,一定程度上影响程序性能;应用场景:

1.当系统需要新的功能时,就是给旧的类添加新的代码。这些新代码通常修饰了原类的核心职责或主要行为,给主类增加了新的领域、新的方法和新的逻辑,从而增加了主类的复杂性。但是,这些新添加的代码只满足了某些特定情况下将要执行的一些特殊行为的需要。装饰模式可以提供一个很好的解决方案。它将每个要修饰的函数分别放在一个类中,并让这个类包装要修饰的对象。因此,当需要执行特殊行为时,客户端代码可以在运行时有选择地顺序包装具有装饰功能的对象。—— 《大话设计模式》

2.展开一个类而不添加子类。

注意事项:

修饰类[Component]应尽可能保持单一职责,功能不要太多;装饰图案中的装饰顺序非常重要;示例:

1.结构类的实现

修饰的抽象类和修饰的具体类

///summary///component class////修饰抽象对象////summary public抽象类component {///summary///object的抽象操作////summary public抽象void operation();}///summary///concrete component////summary public class concrete component : component {///summary////object的具体操作////summary public override void operation(){ console。writeline('组件的具体操作!');}}装饰抽象类和具体装饰类

///summary///decoration类///decoration操作的抽象类///summary公共抽象类decorator :组件{///summary///decorated组件////summary受保护组件组件;///summary///set component///summary//param name=' component '修饰对象/param public void set component(component component){ this。组件=组件;} ///汇总////装饰操作////重新操作(),实际操作是Component操作()////汇总公共覆盖void操作(){if (component!=null) {组件。operation();} } }///summary//混凝土装饰类a////summary公共类混凝土装饰器3360装饰器{///summary////装饰的唯一属性a////区分其他装饰类////summary私有字符串添加状态;///summary////修饰b类的操作////summary public override void operation(){ base . operation();AddedState='我是装饰a ';控制台。write line(added state);} }///Summary//混凝土装饰类b////summary公共类混凝土装饰器b:装饰器{///Summary////装饰类b///的独特操作区分其他装饰类/////Summary private void add behavior(){ console。writeline('装修B类的独特操作');}///summary////装饰类b////summary public override void operation(){ base。operation();AddedBehavior();控制台。WriteLine('装修B类操作');}}客户端

混凝土构件cc=新混凝土构件();decorator CDA=new concrete decora();decorator CDB=new concrete decorator b();cda。setComponent(cc);国开行。setComponent(CDA);国开行。operation();控制台。write line(' * * * * * * * * * * * * * * * * * * * * * * * * * ');执行结果

2.装饰模式下DOTA英雄学习技巧

英雄每次上级,会得到一个技能点学习技能。具体的英雄就相当于【混凝土构件】,技能栏就相当于【装饰师】,具体的技能就相当于【混凝土装饰器】,【混凝土装饰器】

英雄

///摘要///英雄抽象类////摘要公共抽象类Hero {公共字符串HeroName公共抽象void Learnskill();} ///摘要///具体英雄///剑圣////摘要公共类JUGG :英雄{公共JUGG(字符串英雄名){英雄名=英雄名;}公共覆盖void LearnSkill() { Console .写线(英雄名)学习了以上技能');} }技能

///摘要///技能栏,继续学技能////摘要公共抽象类技能装饰者:英雄{私人英雄英雄;公共字符串技能名称公共技能装饰器(英雄英雄,字符串技能名称){ this . hero=hero this . skill name=skill name }公共覆盖void LearnSkill() { if (hero!=null) { hero .学习技能();} } } ///摘要///具体的技能q/总结公共类QSkill : SkillDecorator {公共QSkill(英雄,字符串技能名):基数(英雄,技能名){ }公共覆盖void learn skill(){ LearnQSkill();基地学习技能();} ///摘要///Q技能特性////摘要公共void LearnQSkill() {控制台.WriteLine(“”学习了{0}技能!skill name);} } ///摘要///具体的技能w/总结公共类WSkill : SkillDecorator {公共WSkill(英雄英雄,字符串技能名):基数(英雄,技能名){ }公共覆盖void learn skill(){ learn skill();基地学习技能();} ///摘要///W技能特性////摘要公共无效学习技能(){控制台.WriteLine(“”学习了{0}技能!',skill name);} }客户端

英雄jugg=新' jugg('剑圣');SkillDecorator q=新的QSkill(jugg,)剑刃风暴');SkillDecorator w=new WSkill(q,)治疗守卫');w . Learnskill();结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:的装饰器模式 网络设计模式是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。