如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。

考虑一个简化的餐厅订单处理系统,其中包括服务员(Waiter)、厨师(Chef)和收银员(Cashier)。订单从服务员开始,然后传递给厨师,最后到达收银员。订单对象包含了顾客的点菜信息。

订单类(Order):

public class Order {private String customerName;private String dishName;public Order(String customerName, String dishName) {this.customerName = customerName;this.dishName = dishName;}public String getCustomerName() {return customerName;}public String getDishName() {return dishName;}
}

责任链模式:服务员、厨师和收银员

// 处理订单的接口
public interface OrderHandler {void handleOrder(Order order);
}// 服务员
public class Waiter implements OrderHandler {private OrderHandler nextHandler;public Waiter(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleOrder(Order order) {System.out.println("Waiter takes order from " + order.getCustomerName());if (nextHandler != null) {nextHandler.handleOrder(order);}}
}// 厨师
public class Chef implements OrderHandler {private OrderHandler nextHandler;public Chef(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleOrder(Order order) {System.out.println("Chef prepares dish: " + order.getDishName());if (nextHandler != null) {nextHandler.handleOrder(order);}}
}// 收银员
public class Cashier implements OrderHandler {@Overridepublic void handleOrder(Order order) {System.out.println("Cashier processes payment for " + order.getDishName());}
}

装饰者模式:为订单添加额外信息

// 装饰者抽象类
public abstract class OrderDecorator implements OrderHandler {protected OrderHandler nextHandler;public OrderDecorator(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic abstract void handleOrder(Order order);
}// 装饰者:添加打包信息
public class PackagingDecorator extends OrderDecorator {public PackagingDecorator(OrderHandler nextHandler) {super(nextHandler);}@Overridepublic void handleOrder(Order order) {System.out.println("Packaging decorator adds packaging for " + order.getDishName());if (nextHandler != null) {nextHandler.handleOrder(order);}}
}

客户端代码:

public class Client {public static void main(String[] args) {// 构建责任链:服务员 -> 厨师 -> 装饰者(打包) -> 收银员OrderHandler cashier = new Cashier();OrderHandler packagingDecorator = new PackagingDecorator(cashier);OrderHandler chef = new Chef(packagingDecorator);OrderHandler waiter = new Waiter(chef);// 创建订单Order order = new Order("John", "Pizza");// 提交订单给责任链waiter.handleOrder(order);}
}

在这个例子中,责任链模式帮助我们实现了订单处理的链式调用,而装饰者模式允许我们动态地为订单添加额外的信息(比如打包)。通过这样的设计,我们可以更容易地扩展系统、添加新的处理者或者装饰者,而不必修改现有的类。

Waiter 的构造函数中传递的 nextHandlerChef,而 Chef 的构造函数中传递的是 PackagingDecorator。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】六、树和二叉树

目录 一、树的基本概念 二、二叉树 2.1二叉树的性质 2.2二叉树的存储结构 2.3遍历二叉树 先序遍历 中序遍历 后序遍历 层次遍历 2.4二叉树的应用 计算叶子数 前序遍历建树 根据序列恢复二叉树 计算树的深度 判断完全二叉树 三、线索二叉树 3.1线索化 四、树和森林…

哔哩哔哩HarmonyOS服务卡片开发

#HarmonyOS征文#完整服务卡片项目开发,为Bilibili添加服务卡片。 项目预览视频播放地址 介绍 这是一款纯鸿蒙版的哔哩哔哩服务卡片应用。 6月2日鸿蒙发布,今年的六月已经被鸿蒙刷屏了。从安卓到鸿蒙,最直观的变化应该就是服务卡片了。我也…

Shell三剑客:awk(awk编辑编程)四

一、Break 结束循环 Break 结束循环实例 break[n]&#xff1a;当第n次循环到来后&#xff0c;结束整个循环&#xff0c;n0就是指本次循环当计算的和大于 50 的时候使用 break 结束循环&#xff1a; [rootlocalhost ~]# awk BEGIN { > sum0; for(i0;i<20;i) { > …

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

UDP协议工作原理及实战(二)UDP客户端代码实现

这个是一个测试我们写的函数是否正确。 启动服务&#xff1a;这里边的udpsocket->bind(port)就是对端口号进行连接。

Neural Networks 期刊投稿指南

一 简介 这是国际神经网络学会、欧洲神经网络学会和日本神经网络学会的官方期刊。 论文类型 文章&#xff1a; 原创的、全文长度的文章将被考虑&#xff0c;前提是它们除了摘要形式外尚未发表&#xff0c;并且没有同时在其他地方进行审查。作者可以自愿但不是必须建议一位编辑…

【网络面试必问(9)】Web服务器处理Http请求消息及与客户端交互的原理

接上一篇&#xff1a;【网络面试必问&#xff08;8&#xff09;】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器 这一篇&#xff0c;我们看一下请求消息的终点&#xff0c;Web服务器的程序结构。我们都知道&#xff0c;服务器会同时接收多个客户端的请…

组织框架概念澄清及表设计

组织 企业组织 企业组织就是企业正式编制&#xff0c;以单独的编制&#xff0c;是个人在企业所在的长久的家&#xff0c;类似于所说的考编&#xff0c;在企业体制内的位置&#xff0c;可能一个人在组织有不同的岗位&#xff0c;也可能有不同的项目组&#xff0c;但是&#xf…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己…

C++标准模板库(STL)

标准模板库&#xff08;STL&#xff09;是一组C模板类&#xff0c;提供常见的编程数据结构和函数&#xff0c;如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库&#xff0c;因此&#xff0c;它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

ROS-rosbag

文章目录 一、命令行二、编码 机器人传感器获取到的信息&#xff0c;有时我们可能需要时时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0c;可能需要绘制导航所需的全局地图&#xff0c;地图绘制实现&#xff0c;有两…

ubuntu 在线安装 python3 pip

ubuntu 在线安装 python3 pip 安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip