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();
    }
}
原文地址:https://www.cnblogs.com/MalcolmMeng/p/8780238.html