装饰模式

装饰模式介绍: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有类似的“穿裤子”、“戴帽子”功能,就需要更多的子类来处理。这样子类的数量就非常多了。

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。所以,装饰模式的应用背景就是在不想增加很多子类的情况下扩展类。

原文地址:https://www.cnblogs.com/jwen1994/p/9995057.html