装饰器模式

233 阅读2分钟

      今天吃了黄焖鸡米饭,可以选择加土豆、加青菜,加金针菇等,我决定用这个写一个装饰器模式的代码,看看怎么一层一层装饰

      装饰器模式:在不改变原类和使用继承的情况下,动态扩展一个对象的功能,提供创建一个包装对象也就是装饰对象来包裹真实对象

首先抽象一个PersonComponent接口,定义一个吃饭方法

public interface PersonComponent {

    void eat();

}

定义一个具体吃饭人以张三为例,原类功能-吃黄焖鸡米饭没有任何修饰

public class ZhangeSanComponent implements PersonComponent {
    @Override
    public void eat() {
        System.out.println("吃黄焖鸡米饭!");
    }
}

定义一个抽象的装饰类

public abstract class Decorate implements PersonComponent {

    // 关键引入PersonComponent对象
    private PersonComponent personComponent;

    public Decorate(PersonComponent personComponent) {
        this.personComponent = personComponent;
    }

    @Override
    public void eat() {
        personComponent.eat();
    }
}

现在要加土豆

public class PotatoDecorate extends Decorate {

    public PotatoDecorate(PersonComponent personComponent) {
        super(personComponent);
    }

    @Override
    public void eat() {
        super.eat();
        System.out.println("加土豆!");
    }
}

现在要加青菜

public class GreensDecorate extends Decorate {

    public GreensDecorate(PersonComponent personComponent) {
        super(personComponent);
    }

    @Override
    public void eat() {
        super.eat();
        System.out.println("加青菜!");
    }
}

其他依次类推

现在开始测试

public class Test {

    public static void main(String[] args) {
        // 黄焖鸡米饭
        PersonComponent zhangSan = new ZhangeSanComponent();
        // 加土豆修饰
        Decorate potatoDecorate = new PotatoDecorate(zhangSan);
        // 青菜修饰
        Decorate greensDecorate = new GreensDecorate(potatoDecorate);
        // 每一层执行顺序都是先执行包裹(装饰)的对象方法,直到执行到最顶层原始类
        greensDecorate.eat();

    }
}


"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.2.2\lib\idea_rt.jar=63465:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.2.2\bin" -Dfile.encoding=GBK -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\code\java\target\classes;F:\repository\cglib\cglib\2.2.2\cglib-2.2.2.jar;F:\repository\asm\asm\3.3.1\asm-3.3.1.jar" com.my.test.design.decorate.testdecorate.Test
吃黄焖鸡米饭!
加土豆!
加青菜!

Process finished with exit code 0