博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【笔记】设计模式——装饰者模式
阅读量:6210 次
发布时间:2019-06-21

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

实现一个类似QQavator功能的代码

1、原始实现

1  //存在的问题: 2     //1、wear*方法出现重复代码,可以重构;实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写; 3     //2、倘若需求中新增某种服饰,需要修改Person类代码,不符合开放——封闭原则; 4     //3、客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来; 5     class Person 6     { 7         private string name; 8         private List
clothing=new List
(); 9 public Person(string name)10 {11 this.name = name;12 clothing.Add("裸体帅哥一枚");13 }14 public void WearJeans()15 {16 clothing.Add("犀利哥牌——破洞牛仔裤");17 }18 public void WearRedTshirt()19 {20 clothing.Add("犀利哥牌——墨绿T恤");21 }22 public void WearShoes()23 {24 clothing.Add("犀利哥牌——牛皮靴子");25 }26 public void Show()27 {28 29 Console.WriteLine("大家好,请叫我帅哥{0},今天精心打扮了下,你看我这打扮潮流不?", name);30 foreach (var item in clothing)31 {32 Console.WriteLine("{0}", item);33 }34 }35 36 public static void Main(string[] args)37 {38 Person person = new Person("犀利哥");39 person.WearRedTshirt();40 person.WearJeans();41 person.WearShoes();42 person.Show();43 }

二 改进代码

  

1  //分析: 2     //1、问题1解决,使用运行时的多态; 3     //2、问题2解决,增加新的服饰,继承之; 4     //3、问题3解决,装饰细节在客户端隐藏为一个Wear方法,客户端仅仅需要搭建起装饰链; 5     //4、面向对象特征:继承、运行时的多态、里氏原则使用(41行代码)统一了子类同样操作的代码、 6     //5、Console.WriteLine还是存在子类中重复,能否进一步优化? 7     //6、客户端与超类、子类均存在联系,能否有必要使用工厂模式? 8     class Person 9     {10         protected string name;11         public Person()12         {13         }14         public Person(string name)15         {16             this.name = name;17         }18         public virtual void Wear()19         {20             Console.WriteLine("大家好,请叫我帅哥{0},今天精心打扮了下,你看我这打扮潮流不?", name);21         }22        23     }24    25     class ComponetA : Person26     {27         protected Person com = null;28          public void  SetComponetA(Person com)29         {30             if (com!=null)31             {32                 this.com = com;33             }34         }35         public override void Wear()36         {37             if (com!=null)38             {39                 com.Wear();40             }41         }42         43     }44     class Jeans : ComponetA45     {46         public override void Wear()47         {48             base.Wear();49            Console.WriteLine("犀利哥牌——破洞牛仔裤");50         }51     }52     class Shoes : ComponetA53     {54         public override void Wear()55         {56             base.Wear();57             Console.WriteLine("犀利哥牌——牛皮靴子");58         }59     }60     class RedTshirt : ComponetA61     {62         public override void Wear()63         {64             base.Wear();65             Console.WriteLine("犀利哥牌——墨绿T恤");66         }67         68     }69     class  programmer70     {71         public static void Main(string[] args)72         {73             Person person = new Person("犀利哥");74             Jeans jeans = new Jeans();75             Shoes shoes = new Shoes();76             RedTshirt redTshirt = new RedTshirt();77             jeans.SetComponetA(person);78             shoes.SetComponetA(jeans);79             redTshirt.SetComponetA(shoes);80             redTshirt.Wear();81         }82     }

三、总结  

1、设计模式解决什么问题?

答:装饰模式把“类中装饰功能从类中搬移去除,这样可以简化原有的类”、“有效地把类的核心职责和装饰功能区分开了。而且可以去除相关的装饰逻辑”;

2、通过什么手段达到效果?
答:装饰模式将一个个欲装饰的功能放在单独的类中,达到容易拓展的效果;使用运行时多态把子类中相同的装饰逻辑统一抽离在基类当中,避免了重复代码;

3、应用场景以及约束条件?
答:需要为已有功能动态添加更多功能时候;
约束条件:装饰类彼此之间独立;装饰顺序很重要(相较于建造者模式,不稳定);

4、符合面向对象哪几条原则?
答:里氏替换、开放-封闭、单一职责;

5、不使用设计模式的代码弊端在哪?
答:见代码

6、改变需求,对使用设计模式的代码的健壮性、可维护性、可拓展性检验;

转载于:https://www.cnblogs.com/Jnw-qianxi/p/3707993.html

你可能感兴趣的文章
MVC模式下如何实现RegisterStartupScript等功能
查看>>
Ubuntu 无法mount解决办法
查看>>
详解 Discuz 的 PHP经典加密解密函数 authcode
查看>>
使用curl命令查看访问url的时间
查看>>
WinForm中跨线程操作控件
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Flymeos插桩适配教程
查看>>
还在用PS磨皮去皱?看看如何用神经网络高度还原你的年轻容貌!
查看>>
大端模式与小端模式、网络字节顺序与主机字节顺序
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>