## 一、装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
**装饰模式的出现**
用例子说明:我们想要表达一个人,穿不同衣服,体现不同个性的一个程序。
首先定义一个人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://box.kancloud.cn/2016-02-18_56c5ce724b74f.png)
- 前言
- 抽象工厂——创建型设计模式一
- 工厂三姐妹——创建型设计模式之二
- 初识面向对象设计模式
- 建造者模式——创建型模式之三
- 原型模式——创建型设计模式四
- 适配器 and 组合模式——结构性模式之一
- 桥接模式——结构性设计模式之二
- 组合模式——结构型设计模式之三
- 装饰模式——结构型设计模式之四
- 外观模式——结构型设计模式之五
- 代理模式——结构型设计模式之六
- 观察者模式——行为型设计模式之五
- 模板设计——行为设计模式之一
- 命令模式——行为设计模式之二
- 状态模式——行为型设计模式之三
- 职责模式——行为设计模式之四
- 中介模式——行为模式之六
- 策略+简单工厂 实战篇
- 看观察者怎么全方位观察机房收费系统
- 登陆也需要装饰——机房收费系统装饰模式实战
- 何为抽象?你有本末倒置吗?
- 再回首,策略、简单工厂是否依然?
- 再回首——行为型设计模式