一、装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的出现
用例子说明:我们想要表达一个人,穿不同衣服,体现不同个性的一个程序。
首先定义一个人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();
二、类图