拉面料理店中的装饰者设计模式

拉面料理店中的装饰者设计模式

package july_Thirtieth.Decorator;
/**
 * 被装饰抽象类——面
 * 作用:当具体的被装饰类有多种时,抽象提出该抽象类,用于后面实现多态。
 */
public abstract class Noodle {
    abstract void hardness();

    abstract void soup();

    abstract int price();

}
package july_Thirtieth.Decorator;

/**
 * 具体的被装饰者类—— 客人lee的面类
 * 继承抽象的被装饰者类,并实现其中的抽象方法。
 */
public class LeeNoodle extends Noodle{
    @Override
    void hardness() {
        System.out.println("面");
    }

    @Override
    void soup() {
        System.out.println("汤");
    }

    @Override
    int price() {
        return 28;
    }
}
package july_Thirtieth.Decorator;
/**
 * 具体的被装饰者类—— 客人Moon的面类
 * 继承抽象的被装饰者类,并实现其中的抽象方法。
 */

public class MoonNoodle extends Noodle {
    @Override
    void hardness() {
        System.out.println("面");
    }

    @Override
    void soup() {
        System.out.println("汤");
    }

    @Override
    int price() {
        return 28;
    }
}
package july_Thirtieth.Decorator;

/**
 * 抽象装饰者类——菜单
 * 要点:1.抽象装饰者类中继承该抽象类以保持接口规范
 *      2.包含该抽象类的引用以通过多态的方式对多种被装饰者类进行装饰。
 */
public abstract class ChooseNoodle extends Noodle{
    private Noodle noodle;

    public ChooseNoodle(Noodle noodle) {
        this.noodle = noodle;
    }

    @Override
    void hardness() {
        noodle.hardness();
    }

    @Override
    void soup() {
        noodle.soup();
    }

    @Override
    int price() {
        return noodle.price();
    }
}
package july_Thirtieth.Decorator;

/**
 * 可以加入的小料
 */
public interface NoodleDecorate {
    default void onion(){
        System.out.print("加葱");
    }

    default void chili(){
        System.out.println("加辣椒");
    }

    default void garlic(){
        System.out.println("加蒜");
    }

    default void parsley(){
        System.out.println("加香菜");
    }
}
package july_Thirtieth.Decorator;
/**
 * 装饰者类  猪豚骨面
 */
public class PigNoodle extends ChooseNoodle implements NoodleDecorate{
    public PigNoodle(Noodle noodle) {
        super(noodle);
    }

    @Override
    void hardness() {
        System.out.print("特硬");
        super.hardness();
    }

    @Override
    void soup() {
        System.out.println("豚骨");
        super.soup();
    }

    @Override
    int price() {
        return super.price() + 10;
    }
}
package july_Thirtieth.Decorator;
/**
 * 装饰者类  红烧牛肉面
 */
public class BeefNoodle extends ChooseNoodle implements NoodleDecorate{
    public BeefNoodle(Noodle noodle) {
        super(noodle);
    }

    @Override
    void hardness() {
        System.out.print("软");
        super.hardness();
    }

    @Override
    void soup() {
        System.out.print("冬阴功牛肉");
        super.soup();
    }

    @Override
    int price() {
        return super.price() + 15;
    }
}
package july_Thirtieth.Decorator;

public class NoodleTest {
    public static void main(String[] args) {
//        客人Lee点了一份牛肉面
        final BeefNoodle beefNoodle = new BeefNoodle(new LeeNoodle());
        final int price = beefNoodle.price();
        System.out.print("Lee点的面是: ");
        beefNoodle.soup();
        beefNoodle.onion();
        beefNoodle.chili();
        System.out.println(price);

//      客人Moon点了一份牛肉面
        final BeefNoodle beefNoodle1 = new BeefNoodle(new MoonNoodle());
        System.out.println(beefNoodle1.price());

//      客人Lee又点了一份猪肉面
        final PigNoodle pigNoodle = new PigNoodle(new LeeNoodle());
        System.out.println(pigNoodle.price());

    }
}

版权声明:本文为m0_47349308原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。