首页 > 其他分享 >巧妙的煎饼

巧妙的煎饼

时间:2024-08-16 18:37:29浏览次数:4  
标签:return 巧妙 getMsg 煎饼 getPrice battercake public

问题提出:上班族大部分都吃过煎饼,煎饼一般5块钱,可以额外加码比如鸡蛋+1元,香肠+2元。 编写一个程序 可以 快速计算出 煎饼 多少钱。
大部分人写的代码:
首先建个煎饼类,最基础的类:

public class Battercake {
    protected String getMsg(){
        return "煎饼";
    }
    public int getPrice(){
        return 5;
    }
}

再建个鸡蛋煎饼类,继承煎饼类然后修改价格

public class BattercakeWithEgg extends Battercake{
    protected String getMsg(){
        return super.getMsg() + "+1个鸡蛋";
    }
    public int getPrice(){
        return super.getPrice() + 1;
    }
}

再在鸡蛋煎饼的基础上加个香肠

public class BattercakeWithEggAndSauage extends BattercakeWithEgg{、
    protected String getMsg(){
        return super.getMsg() + "+1根香肠";
    }
    public int getPrice(){
        return super.getPrice() + 2;
    }
}

测试一下:

public static void main(String[] args) {
        Battercake battercake = new Battercake();
        System.out.println(battercake.getMsg() + ",总价:" + battercake.getPrice());

        BattercakeWithEgg battercakeWithEgg = new BattercakeWithEgg();
        System.out.println(battercakeWithEgg.getMsg() + ",总价:" + battercakeWithEgg.getPrice());

        BattercakeWithEggAndSauage battercakeWithEggAndSauage = new BattercakeWithEggAndSauage();
        System.out.println(battercakeWithEggAndSauage.getMsg() + ",总价:" + battercakeWithEggAndSauage.getPrice());
    }

运行结果:

"D:\Program Files\Java\jdk1.8.0_181\bin\java.exe" 
煎饼,总价:5
煎饼+1个鸡蛋蛋,总价:6
煎饼+1个鸡蛋蛋+1根香肠,总价:8

代码写到这儿,感觉很easy,没毛病。但是如果 我想加两个鸡蛋 怎么办呢,难道再写一个类?我不想加蛋,只要个香肠又怎么办呢。这个需求完全没问题,代码如何灵活变化呢。
我们来看一位老师给出的代码:
首先创建一个抽象类:

public abstract class Battercake {
    protected abstract String getMsg();
    protected abstract int getPrice();
}

再创建一个煎饼类:

public class BaseBattercake extends Battercake {
    protected String getMsg() {
        return "煎饼";
    }
    protected int getPrice() {
        return 5;
    }
 }

重点来了,创建一个抽象扩展类,仔细看下面的代码

public abstract class BattercakeDecorator extends Battercake {

    //用了抽象类当一个属性
    private Battercake battercake;

    public BattercakeDecorator(Battercake battercake) {
        this.battercake = battercake;
    }

    public abstract void doSomething();

    protected String getMsg() {
        return this.battercake.getMsg();
    }

    protected int getPrice() {
        return this.battercake.getPrice();
    }
}

最后创建鸡蛋类的扩展:

public class EggDecorator extends BattercakeDecorator {
    public EggDecorator(Battercake battercake) {
        super(battercake);
    }

    public void doSomething() {

    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "1个鸡蛋";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 1;
    }
}

香肠类的扩展:

public class SausageDecorator extends BattercakeDecorator {
    public SausageDecorator(Battercake battercake) {
        super(battercake);
    }

    public void doSomething() {

    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "1根香肠";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 2;
    }
}


测下代码:

public static void main(String[] args) {

        Battercake battercake;

        battercake = new BaseBattercake();

        //加个蛋
        battercake = new EggDecorator(battercake);

		//加个肠
        battercake = new EggDecorator(battercake);

 		//加个蛋
        battercake = new SausageDecorator(battercake);

        System.out.println(battercake.getMsg() + ",总价:" + battercake.getPrice());
"D:\Program Files\Java\jdk1.8.0_181\bin\java.exe"
煎饼1个鸡蛋1个鸡蛋1根香肠,总价:9

有没有觉得的很神奇,通过抽象类,继承,构造函数里传入接口对象,完成了自由扩展特性。想加几个蛋就加几个,不必再去修改计算逻辑。

这部分代码实际来自 Tom的书《设计模式就该这样学》, 这种处理方式叫 装饰器模式,之前学习设计模式总觉得很枯燥, 直到遇到这个例子才激发学习乐趣,这种接地气的代码印象深刻值得反复思考

标签:return,巧妙,getMsg,煎饼,getPrice,battercake,public
From: https://www.cnblogs.com/hichanglong/p/18363451

相关文章

  • 创造智能对话:在LangChain中巧妙使用变量与模板
    创造智能对话:在LangChain中巧妙使用变量与模板在人工智能的世界里,对话管理是一项艺术,也是一项技术挑战。LangChain作为一个前沿的对话管理框架,提供了一套强大的工具,让开发者能够创建动态、个性化的对话体验。本文将深入探讨如何在LangChain中创建和管理变量,通过详细的步骤......
  • 插件冲突克星:在PyCharm中巧妙解决插件冲突
    插件冲突克星:在PyCharm中巧妙解决插件冲突PyCharm作为开发者广泛使用的集成开发环境(IDE),拥有丰富的插件生态来扩展其功能。然而,插件的增多也带来了潜在的冲突问题,这些冲突可能会导致IDE运行缓慢、不稳定甚至崩溃。本文将详细介绍如何在PyCharm中诊断和解决插件冲突问题,确保......
  • 探讨C++中巧妙的边界条件处理:以花坛种花问题为例【巧妙思想、边界条件】
    在算法题中,处理数组的边界条件是一个常见的挑战。特别是在涉及多条件判断时,如何高效且清晰地处理边界问题,可以显著提升代码的简洁性和可读性。本文将以一道经典的算法题——花坛种花问题,来探讨边界条件的巧妙处理方法。问题描述605.种花问题-力扣(LeetCode)给定一个由......
  • 黑球白球巧妙异或问题
    题目:一个桶里一共有a个白球和b个黑球。每次拿出2个球,并且每个球被拿出的概率相等。如果拿出一黑一白,就往桶里放进一个黑球;如果拿出两个黑或者两个白,就往桶里放进一个白球。求:最后只剩一个黑球的概率是多少? 答案:如果黑球个数是偶数,最后剩下为黑球的概率是0%......
  • 大数据来袭:在Postman中巧妙处理大型响应数据的秘籍
    ......
  • 妙,奇妙,玄妙,美妙,微妙,高妙,巧妙,妙不可言
    语言是很奇妙的雄鸡司晨,公鸡只是在咯咯地叫吗?其实,公鸡是一个巫师,它是在召唤(call),召唤什么?召唤太阳(O),拟人化、或神格化之后,太阳就变成了上帝(God)或者神(god),雄鸡一唱天下白,God(上帝)其实就是太阳神,太阳神出来之后,发光普照天下,发的什么光?bright明亮的光,其实就是白光,blank(空白的),ban......
  • 数论--有关模运算的巧妙
    萌萌的好数链接:https://ac.nowcoder.com/acm/contest/84851/D来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288K64bitIOFormat:%lld题目描述萌萌喜欢“好数”,这种“好数“需要满足以下两个条件:1.该数对3取模不为02.该数的最后一位数字......
  • 巧妙使用mapstruct来解决数据库entiy到实体dto的映射关系
    1.引入mapstruct<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-p......
  • 信息学奥赛初赛天天练-17-阅读理解-浮点数精准输出与海伦公式的巧妙应用
    PDF文档公众号回复关键字:2024053112023CSP-J阅读程序1阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)源代码#include<iostream>#include<cmath>usingnamespacestd;doublef(doublea,double......
  • 如何巧妙应对iOS键盘难题?
    前言写过移动端的同学或多或少都遇到过软键盘带来的各种各样的问题,最典型的就是输入框被软键盘遮挡、fixed元素失效等问题,并且这些问题在iOS上的表现让人难以接受。webview的差异在移动端上,我们的H5页面一般是运行在宿主APP提供的webview中,简单点理解,你其实可以把它当作浏览器,......