装饰模式——结构型设计模式之四

最后更新于: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)
';