【笔记】设计模式——装饰者模式

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

1、原始实现


 1  //存在的问题:
2 //1、wear*方法出现重复代码,可以重构;实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写;
3 //2、倘若需求中新增某种服饰,需要修改Person类代码,不符合开放——封闭原则;
4 //3、客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来;
5 class Person
6 {
7 private string name;
8 private List<string> clothing=new List<string>();
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 : Person
26 {
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 : ComponetA
45 {
46 public override void Wear()
47 {
48 base.Wear();
49 Console.WriteLine("犀利哥牌——破洞牛仔裤");
50 }
51 }
52 class Shoes : ComponetA
53 {
54 public override void Wear()
55 {
56 base.Wear();
57 Console.WriteLine("犀利哥牌——牛皮靴子");
58 }
59 }
60 class RedTshirt : ComponetA
61 {
62 public override void Wear()
63 {
64 base.Wear();
65 Console.WriteLine("犀利哥牌——墨绿T恤");
66 }
67
68 }
69 class programmer
70 {
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、改变需求,对使用设计模式的代码的健壮性、可维护性、可拓展性检验;

【笔记】设计模式——装饰者模式,布布扣,bubuko.com

时间: 2024-08-06 11:54:22

【笔记】设计模式——装饰者模式的相关文章

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路.----题记 设计模式 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承者更有弹性的替代方案. 设计原则 (1)封装变化. (2)多用组合,少用继承. (3)针对接口编程,而不是

5分钟读书笔记之 - 设计模式 - 装饰者模式

本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者模式对象是一种更灵活的选择. 装饰者可用于为对象增加功能.它可以用来替代大量子类. 考虑前面的自行车类,你现在可能提供一些配件供用户选择,装饰者模式要求我们只需要创建选件类,这些类与四种自行车类都要实现Bicycle接口,但是他们只被用作这些自行车类的包装类.在这个例子

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor