装饰模式介绍:http://www.runoob.com/design-pattern/decorator-pattern.html
允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们来看一个简单的案例:一个人穿衣服
定义一个Person类
public class Person { private String name; public Person() { super(); } public Person(String name) { super(); this.name = name; } public void show(){ System.out.println("我是一个人"); } }
定义一个TShirts类,继承了Person类
public class TShirts extends Person { private Person person; public void decorate(Person person){ this.person = person; } public void show(){ person.show(); System.out.println("我穿大T恤"); } }
定义一个Trouser类,继承了Person类
public class Trouser extends Person { private Person person; public void decorate(Person person){ this.person = person; } public void show() { person.show(); System.out.println("我穿裤子"); } }
测试代码
public class Test { public static void main(String[] args) { Person p = new Person("张三"); TShirts ts = new TShirts(); Trouser tr = new Trouser(); ts.decorate(p); tr.decorate(ts); tr.show(); } }
输出结果:
我是一个人
我穿大T恤
我穿裤子
以“一个人穿衣服”为例,Person类没有完成“穿衣服”功能,为了完成“穿T恤”的功能,我们或许会直接在Person类中修改代码,这样以后需要“穿裤子”、“戴帽子”都需要在Person类中修改。如果创建子类来完成“穿T恤”功能,那么“穿裤子”、“戴帽子”都需要创建子类。如果另一个玩具类Toy有类似的“穿裤子”、“戴帽子”功能,就需要更多的子类来处理。这样子类的数量就非常多了。
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。所以,装饰模式的应用背景就是在不想增加很多子类的情况下扩展类。