趣解装饰者模式之《我想吃煎饼果子了》

news2024/12/23 19:15:36

〇、小故事

话说最近早起没时间做早饭,并且早上上班的地铁口不远处就有一处非常火爆的煎饼摊,所以我就经常去那边吃煎饼,一个“基础版”煎饼是7块钱,向煎饼中加一颗鸡蛋是1元钱加一根火腿肠是3元钱加鸡柳是4元钱……

好像基本上能想到的美食都能往煎饼里塞似的。这就让我想起之前看过的一个短视频,一个小伙子去买煎饼,说要加50颗鸡蛋,然后摊出来的煎饼果子跟一个大披萨似的,非常有趣。

那么,做煎饼果子似乎没什么难度,但是,怎么计算总价呢?我们可以往里放各种“辅料”,那计算出来的总价也会千差万别,如果说我们针对不同的煎饼搭配组合都实现cost()价格方法,这样可以吗?如果这种种类少,其实是可以的,但是,如果组合非常多,那必然就造成了“类爆炸了”,那么这种设计方式就不合适了。

那我们还有什么解决办法吗?我们可以采用装饰者模式,来解决这个问题。下面,我们就将视野转到装饰者模式吧。

一、模式定义

装饰者模式定义:

动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

模拟顾客购买煎饼果子+1颗鸡蛋+1根香肠的过程:

二、模式类图

为了可以进一步说明装饰者模式在购买煎饼问题上的处理方法,我们以类图的方式展示煎饼与辅料之间的关系。需要说明的一点是,为了表示煎饼的实现类可以是一个“种族”,所以列举出了“白面煎饼”、"黑面煎饼"和“杂粮煎饼”,这些都属于上面我们所描述的基础类煎饼

三、代码实现

创建食物抽象类Food,所有食物都需要继承该抽象类:

public abstract class Food {
    String description = "食物";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

创建辅料抽象类AccessoriesDecorator,后续添加到煎饼果子里的辅料都需要继承该类:

public abstract class AccessoriesDecorator extends Food {
    public abstract String getDescription();
}

创建基础版煎饼果子类JianBing,需要继承Food抽象类:

public class JianBing extends Food {

    public JianBing() {
        description = "基础版煎饼果子";
    }

    public double cost() {
        System.out.println("基础版煎饼果子售价:" + 7 + "元");
        return 7;
    }
}

创建鸡蛋类Egg,由于它属于辅料,所以继承AccessoriesDecorator抽象类:

public class Egg extends AccessoriesDecorator {

    private Food food;

    public Egg(Food food) {
        this.food = food;
    }

    public String getDescription() {
        return "鸡蛋";
    }

    public double cost() {
        System.out.println("添加鸡蛋售价:" + 1 + "元");
        return 1 + food.cost();
    }
}

创建鸡蛋类Sausage,由于它属于辅料,所以继承AccessoriesDecorator抽象类:

public class Sausage extends AccessoriesDecorator {
    private Food food;

    public Sausage(Food food) {
        this.food = food;
    }

    public String getDescription() {
        return "香肠";
    }

    public double cost() {
        System.out.println("添加香肠售价:" + 3 + "元");
        return 3 + food.cost();
    }
}

创建测试类DecoratorTest,计算购买1个基础版煎饼果子加入1颗鸡蛋加入1根香肠的总消费金额:

public class DecoratorTest {
    public static void main(String[] args) {
        // 创建煎饼果子
        Food jianBing = new JianBing();
        
        // 创建鸡蛋,加入到煎饼果子中
        Food egg = new Egg(jianBing);
        
        // 创建香肠,加入到煎饼果子中
        Food sausage = new Sausage(egg);
        
        System.out.println("总金额为:" + sausage.cost() + "元");
    }
}

输出结果:

添加香肠售价:3元
添加鸡蛋售价:1元
基础版煎饼果子售价:7元
总金额为:11.0元

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法日志】动态规划刷题:不相邻选择类问题(day40)

算法随想录刷题60Day 目录 前言 打家劫舍1 (数组) 打家劫舍2(环形数组) 打家劫舍3(二叉树) 前言 今天主要讨论不相邻选择类问题,会在不同数据结构题型的下探讨该类问题的解法。 打家劫舍1 (数组) 本题只需要讨论当…

微信开发之朋友圈自动评论的技术实现

简要描述: 朋友圈评论 请求URL: http://域名地址/snsComment 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wI…

炒股10倍杠杆软件是什么?出现账户安全问题怎么办?有三个方法解决

炒股10倍杠杆软件是指一种用于股票交易的杠杆交易软件,可以将投资者的交易资金进行多倍放大,以获得更高的投资回报。然而,使用杠杆交易软件也伴随着一些账户安全问题,因此,本文将介绍三个方法来解决这些问题。 一、加…

C语言面试题-指针

#include <stdio.h> int main() {char str1[] "hello bit.";//地址不同char str2[] "hello bit.";const char* str3 "hello bit.";//常量是不可以被修改的const char* str4 "hello bit.";//常量是不可以被修改的if (str1 s…

臻图信息以数字孪生技术推动智慧小区数字化建设

伴随着智慧城市建设进程的加速发展&#xff0c;加速传统小区的管理与服务向智能化升级转型。运用智慧化的管理和服务&#xff0c;利用信息技术和物联网等技术手段&#xff0c;将传统的居住区域与智能设备相结合&#xff0c;实现楼宇、社区设施、服务管理的数字化、网络化、智能…

为什么中国软件需要国产化?

国产化是指技术引进项目投产后所生产的产品中&#xff0c;国内生产件的数量占整件产品生产件数量。换句话说&#xff0c;软件国产化的占比&#xff0c;直接影响到技术是否会在某一个时点上被”卡脖子“。 随着国家经济的发展和技术水平的提高&#xff0c;国家整体实力大大增强…

产品展示视频制作的要点

制作产品展示视频时通过精心策划的视频剧本和拍摄手法&#xff0c;可以准确地呈现活动的目的、主题和特点&#xff0c;让观众更好地理解和认同活动的意义。深圳产品活动视频制作公司老友记小编还为您整理了以下一些重要的制作要点&#xff1a; 1.明确目标受众&#xff1a;了解你…

博睿数据当选粤港澳大湾区金融创新研究院理事会单位,助力金融科技创新发展

近日&#xff0c;博睿数据当选粤港澳大湾区金融创新研究院理事会单位。这是对博睿数据在金融科技领域所取得成绩的高度认可&#xff0c;也是对其创新能力和发展潜力的充分肯定。 粤港澳大湾区金融创新研究院由粤港澳三地金融行业、高等院校高层和专家学者共同发起&#xff0c;经…

HarmonyOS ArkUI Canvas(你相信光吗?)

文章目录 前言一、Canvas是什么&#xff1f;二、画神光棒1.绘制神光棒左右侧2.中心圆形其他部分 总结 前言 昨天华为mate60提前发售&#xff0c;网上流传,麒麟9000s&#xff0c;“4G改””&#xff0c;“突破列强科技封锁”等字眼流传在各大社交平台&#xff0c;我对着那些mate…

ABB USC329AE01控制器模块

多通道控制&#xff1a; USC329AE01 控制器模块通常具有多个控制通道&#xff0c;可用于监测和控制不同的过程变量。 通讯接口&#xff1a; 这种模块通常支持各种通讯接口&#xff0c;如以太网、串口&#xff08;RS-232、RS-485&#xff09;、Profibus、Modbus 等&#xff0c;…

提高办公效率,离不开微服务平台框架的助攻!

如今&#xff0c;低代码技术平台获得了很多企业的青睐和喜爱&#xff0c;由于其灵活、易操作、好维护、能提质增效等优势特点&#xff0c;赢得了不少新老客户朋友的追捧。微服务平台框架是其中的一个重要功能&#xff0c;如果想要做好数据资源管理&#xff0c;提高办公协作效率…

提升方法AdaBoost算法

此算法就是一个学习&#xff0c;然后积累&#xff0c;再学习的方法。 大概流程是首先建立一个弱分类&#xff0c;然后计算其错误率&#xff0c;根据错误的样本数给样本分配权重&#xff0c;然后再根据这个样本权重去计算新的最小分类错误率&#xff0c;以此类推&#xff0c;直…

多语言代入电商平台api接口采集唯品会获取vip商品详情数据示例

商品详情API接口的作用和重要性主要体现在以下几个方面&#xff1a; 获取详细商品信息&#xff1a;商品详情API接口提供了获取商品的完整详细信息的功能。这包括商品名称、价格、库存、规格、描述、图片、运费等。这些详细信息对于用户来说是购买决策的重要依据。提供用户购物…

uniapp简单版语音唤醒

第一步&#xff1a; 先登录--- 获取唤醒词 相关网址 百度AI开放平台-全球领先的人工智能服务平台-百度AI开放平台 第二步&#xff1a; 去注册百度云 访问这个网址 百度智能云-登录 去创建应用 请注意自己的 app的打包时候的包名 要填上啊&#xff01;&#xff01;&am…

EOCR-AR电机保护器自动复位的启用条件说明

为适用不同的现场使用需求&#xff0c;施耐德韩国公司推出了带有自动复位功能的模拟型电动机保护器-EOCR-AR。EOCR-AR电机保护器具有过电流、缺相、堵转保护功能&#xff0c;还可根据实际需要设置自动复位时间。 EOCR-AR自动复位的设置方法 如上图&#xff0c;R-TIME旋钮是自动…

如何选择合适的第三方控价服务商

控价是一件对于品牌方、经销商、消费者来说都有益处的事情&#xff0c;但是控价也是一件敏感的事情&#xff0c;要做好控价&#xff0c;不仅要有专业的知识&#xff0c;还要有丰富的经验&#xff0c;因为在平台上控价&#xff0c;除了要尊重平台的规则外&#xff0c;还要熟悉政…

每日一练 | 华为认证真题练习Day106

1、链路聚合技术中&#xff0c;Eth-Trunk可以根据哪些参数来实现流量的负载分担&#xff1f;&#xff08;多选&#xff09; A. 相同的源IP地址或目的IP地址 B. 相同的源端口号或目的端口号 C. 相同的源MAC地址或目的MAC地址 D. 相同的协议类型 2、Truk端口可以允许多个VLAN…

另类创意火爆!小卖靠创意文具走红TikTok

英国一位小卖家结合短视频&#xff0c;靠创意文具一年也赚了十几万美金&#xff0c;而她大多数文具并没有芭比元素。当然&#xff0c;这场“粉色风暴”中&#xff0c;或许她也在酝酿新的创意灵感。 创意文具走红TikTok 在Instagram上&#xff0c;漂亮的“Instagrammable”文具…

Android开发血动脉——Binder机制

Binder是Android中的一个类&#xff0c;它继承了IBinder接口。从IPC角度来说&#xff0c;Binder是Android中的一种跨进程通信方式&#xff0c;Binder还可以理解为一种虚拟的物理设备&#xff0c;它的设备驱动是/dev/binder&#xff0c;该通信方式在linux中没有。从Android Fram…

cocosCreator 之 3.8打包注意事项

版本&#xff1a; v3.8.0 环境&#xff1a; Mac 介绍 曾编写过一篇文章&#xff1a; cocosCreator笔记 之 Android打包 使用的版本是&#xff1a; v3.4.0 在官方发布最新版本3.8.0后&#xff0c;就编写了Demo尝试打包发布下&#xff0c;结果一路的报错问题。 写此博客&…