3装饰者模式
图片来自head first 设计模式,仅供学习之用
装饰者模式设计的关键之处就是最顶层的接口或抽象类设计,设计的时候要注意保证接口或抽象类的动作要完全,并且要保持稳定。
仿照head first ,以煎饼果子为例,写了个小例子
package com.company; abstract class jian_bing{ protected String taste; abstract public double price(); abstract public int time(); abstract public void show(); } abstract class jian_bing_decorator extends jian_bing{ protected jian_bing jian_bing_instace; } class beijing_jian_bing extends jian_bing{ @Override public void show() { System.out.println(taste); System.out.println("价格:"+price()); System.out.println("制作时间:"+time()); } public beijing_jian_bing(){ taste="北京风味煎饼"; } @Override public double price() { return 5; } @Override public int time() { return 2; } } class shandong_jian_bing extends jian_bing{ public shandong_jian_bing(){ taste="山东风味煎饼"; } @Override public double price() { return 3; } @Override public int time() { return 1; } public void show() { System.out.println(taste); System.out.println("价格:"+price()); System.out.println("制作时间:"+time()); } } class jian_bing_with_liji extends jian_bing_decorator{ public jian_bing_with_liji(jian_bing jian_bing_instance){ this.jian_bing_instace=jian_bing_instance; taste=jian_bing_instance.taste+" "+"+里脊"; } @Override public double price() { return jian_bing_instace.price()+1.5; } @Override public void show() { System.out.println(taste); System.out.println("价格:"+price()); System.out.println("制作时间:"+time()); } @Override public int time() { return jian_bing_instace.time()+1; } } class jian_bing_with_jidan extends jian_bing_decorator{ @Override public void show() { System.out.println(taste); System.out.println("价格:"+price()); System.out.println("制作时间:"+time()); } public jian_bing_with_jidan(jian_bing jian_bing_instance){ this.jian_bing_instace=jian_bing_instance; taste=jian_bing_instance.taste+" "+"+鸡蛋"; } @Override public double price() { return jian_bing_instace.price()+1; } @Override public int time() { return jian_bing_instace.time()+1; } } class DecratorTest{ public static void test(){ jian_bing my_jian_bing=new beijing_jian_bing(); my_jian_bing.show(); my_jian_bing=new jian_bing_with_jidan(my_jian_bing); my_jian_bing.show(); my_jian_bing=new jian_bing_with_liji(my_jian_bing); my_jian_bing.show(); my_jian_bing=new jian_bing_with_jidan(new jian_bing_with_liji(new shandong_jian_bing())); my_jian_bing.show(); } }