设计模式-装饰者模式

​ 这一章看完之后,我感觉,装饰者模式就是对类继承的一种递归调用式的组合应用,很好的是实现了开闭原则,可以有效的扩展应用程序。比如书中的例子,有几种饮料,每种饮料的价格已经知道了,但是我们又有很多种的调料,每种调料也有它的价格,我们现在需要是在饮料中加调料,那么这样一来,饮料的售价就会变化,如何来描述这种售价呢?如果通过对调料种类的组合来定义若干的类,肯定是非常愚蠢的行为。

​ 通过装饰者模式,就能很好的解决这个问题,我们将这些类分为装饰类(调料),待装饰类(饮料)两种,这两种类继承同一个父类,不同的是装饰类中的构造函数有一个父类引用的构造函数,这样子就可以递归调用构造函数来进行 装饰了。

1
2
3
4
5
6
7
8
9
10
11
12
public class A extends BaseClass{

public string who()
{
return "A";
}

public int cost()
{
return 5;
}
}

我们定义一个待装饰类A,再定义几个装饰类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class decorator1 extends BaseClass{
BaseClass baseClass;
public decorator1(BaseClass t)
{
this.baseClass = t;
}
public string who()
{
return baseClass.who()+",decoratro1";
}
public int cost()
{
return baseClass.cost()+10;
}
}
public class decorator2 extends BaseClass{
BaseClass baseClass;
public decorator2(BaseClass t)
{
this.baseClass = t;
}
public string who()
{
return baseClass.who()+",decoratro2";
}
public int cost()
{
return baseClass.cost()+20;
}
}

然后我们在用decorator1 和decorator2 来装饰A的时候,就有了很犀利的调用方法:

1
2
3
4
5
A  a;
a=new decorator1(a);
a=new deocorator2(a);
system.out.println(a.who());
system.out.println(a.cost());

这样子 输出就是

1
2
A,decorator1,decorator2
35

实际的调用过程就是一个递归的过程。

装饰者模式的定义:

1
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案

其中用到的设计原则:

1
开闭原则:对扩展开放,对修改关闭