门面模式 与 装饰器模式(2)

简介: 门面模式 与 装饰器模式(2)

六、装饰器模式代码示例


image.png


来看一个这样的场景,上班族白领其实大多有睡懒觉的习惯,每天早上上班都是踩点,于是很多小伙伴为了多赖一会儿床都不吃早餐。那么,也有些小伙伴可能在上班路上碰到卖煎饼的路边摊,都会顺带一个到公司茶水间吃早餐。卖煎饼的大姐可以给你的煎饼加鸡蛋,也可以加香肠。


首先创建一个煎饼Battercake类:


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


创建一个加鸡蛋的煎饼BattercakeWithEgg类:


public class BattercakeWithEgg extends Battercake {
    @Override 
    protected String getMsg(){ return super.getMsg() + "+1个鸡蛋";}
    @Override 
    //加一个鸡蛋加 1 块钱 
    public int getPrice(){ return super.getPrice() + 1;}
}


再创建一个既加鸡蛋又加香肠的BattercakeWithEggAndSausage类:


public class BattercakeWithEggAndSauage extends BattercakeWithEgg {
    @Override
    protected String getMsg(){ return super.getMsg() + "+1根香肠";}
    @Override
    //加一个香肠加 2 块钱
    public int getPrice(){ return super.getPrice() + 2;}
}


编写客户端测试代码:


public class Test {
    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());
    }


运行结果:


煎饼,总价:5
煎饼+1个鸡蛋,总价:6
煎饼+1个鸡蛋+1根香肠,总价:8


运行结果没有问题。


但是,如果用户需要一个加2个鸡蛋加1根香肠的煎饼,那么用我们现在的类

结构是创建不出来的,也无法自动计算出价格,除非再创建一个类做定制。如果需求再变,一直加定制

显然是不科学的。那么下面我们就用装饰器模式来解决上面的问题。


首先创建一个建煎饼的抽象

Battercake类:


public abstract class Battercake {
    protected abstract String getMsg();
    protected abstract int getPrice();
}
目录
相关文章
|
前端开发 JavaScript UED
页面美化
页面美化
392 2
|
存储 监控 Go
带你十天轻松搞定 Go 微服务系列(九、链路追踪)
带你十天轻松搞定 Go 微服务系列(九、链路追踪)
|
9月前
|
数据采集 JavaScript Python
如何根据目标网站调整Python爬虫的延迟时间?
如何根据目标网站调整Python爬虫的延迟时间?
|
资源调度 Linux iOS开发
GPT栏目:yarn 安装
本文提供了在Windows、macOS和Linux操作系统上安装yarn的详细步骤,包括通过Windows安装程序、使用Homebrew在macOS上安装,以及通过包管理器在不同Linux发行版上安装yarn,并验证安装是否成功。
GPT栏目:yarn 安装
|
canal Kubernetes Docker
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
318 10
|
机器学习/深度学习 数据采集 人工智能
【AAAI 2024】解锁深度表格学习(Deep Tabular Learning)的关键:算术特征交互
近日,阿里云人工智能平台PAI与浙江大学吴健、应豪超老师团队合作论文《Arithmetic Feature Interaction is Necessary for Deep Tabular Learning》正式在国际人工智能顶会AAAI-2024上发表。本项工作聚焦于深度表格学习中的一个核心问题:在处理结构化表格数据(tabular data)时,深度模型是否拥有有效的归纳偏差(inductive bias)。
|
存储 Oracle 网络协议
实战篇:使用 StarWind 配置 ISCSI 共享存储
实战篇:使用 StarWind 配置 ISCSI 共享存储
实战篇:使用 StarWind 配置 ISCSI 共享存储
|
JavaScript 前端开发
VUE父组件向子组件传递数据和方法
VUE父组件向子组件传递数据和方法
222 0
|
运维 安全 机器人