今天吃了黄焖鸡米饭,可以选择加土豆、加青菜,加金针菇等,我决定用这个写一个装饰器模式的代码,看看怎么一层一层装饰
装饰器模式:在不改变原类和使用继承的情况下,动态扩展一个对象的功能,提供创建一个包装对象也就是装饰对象来包裹真实对象
首先抽象一个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