装饰模式——结构型设计模式之四
最后更新于:2022-04-01 09:30:11
## 一、装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
**装饰模式的出现**
用例子说明:我们想要表达一个人,穿不同衣服,体现不同个性的一个程序。
首先定义一个人Person类;在定义一个抽象的衣服Clothes类,然后有各种衣服的子类。
在客户端通过实例化“人”,然后再实例化需要的“衣服”,分别调用show方法。
这样也可以达到目的,但是我们看分析一下客户端。
~~~
Person a=new Person("小明");
T恤 t=new T恤();
垮裤 K=new 垮裤();
球鞋 q=new 球鞋();
//显示
a.show();
t.show();
k.show();
q.show();
~~~
**问题一:**从上述代码中可以看出这些穿衣服的顺序我们可以任意调换,但是一调换,是不是,可能就是另外一种装扮了,所以这样写的代码结构不稳定。
**问题二:**以上是一种装扮,如果我要展示N中装扮呢,我就需要把这些代码重复N遍。
**为了避免这些问题,所以有了装饰模式。**
使用装饰模式可以再客户端中将装饰过程进行嵌套封装,即使同样的衣服,改变一下顺序,就可以穿出两种风格。而且,穿衣服的件数不一定相同。
同时还减少了代码的数量,只需要用一个show方法就可以调出嵌套的一系列动作。
**使用装饰模式:**
需要再衣服类中增加一个Decorate方法,用来给嵌套的要装饰对象赋值。
代码显示:
~~~
Person a=new Person("小明");
T恤 t=new T恤();
垮裤 K=new 垮裤();
球鞋 q=new 球鞋();
//动作嵌套
q.decorate(a);
k.decorate(q);
t.decorate(k);
//显示
t.show();
~~~
## 二、类图
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c5ce724b74f.png)