装饰者模式

188 阅读1分钟

介绍

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

使用

public class Decorator {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Tom");
        TShirt tShirt = new TShirt();
        tShirt.Decorate(person);
        BigShoe bigShoe = new BigShoe();
        bigShoe.Decorate(tShirt);
        Jeans jeans = new Jeans();
        jeans.Decorate(bigShoe);
        jeans.show();
    }
}

/**
 * 装饰功能
 */
interface Dressing{
    void show();
}
/**
 * 本尊
 */
class Person implements Dressing{
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void show(){
        System.out.printf("装扮的%s",name);
    }
}

/**
 * 装饰器
 */
class Finery implements Dressing{

    private Dressing component;

    public void Decorate(Dressing component){
        this.component = component;
    }

    public void show() {
        if (component != null){
            component.show();
        }
    }
}

/**
 * 装饰物
 */
class TShirt extends Finery{

    @Override
    public void show() {
        System.out.println("T-shirt");
        super.show();
    }
}
/**
 * 装饰物
 */
class Jeans extends Finery{

    @Override
    public void show() {
        System.out.println("Jeans");
        super.show();
    }
}
/**
 * 装饰物
 */
class BigShoe extends Finery{

    @Override
    public void show() {
        System.out.println("BigShoe");
        super.show();
    }
}

特点

有效的把类的核心职责和装饰功能区分开,可以去除相关类的重复的装饰逻辑