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

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

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());

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值