设计模式——业务代表模式

定义与概念

  • 业务代表模式(Business Delegate Pattern)是一种设计模式,它用于在表示层(如用户界面)和业务逻辑层之间提供一个抽象层。业务代表就像是一个中间人,隐藏了业务服务的复杂性和底层实现细节,使得表示层可以更加简单地调用业务服务。
  • 例如,在一个企业级应用中,有一个用户界面模块用于展示员工信息。而员工信息存储在数据库中,需要通过复杂的数据库访问层和业务逻辑层来获取和处理。业务代表模式可以在用户界面和这些复杂的后端服务之间创建一个业务代表对象,这个对象提供简单的接口给用户界面,代表用户界面与后端服务进行交互。

结构组成

  • 业务代表(Business Delegate):
    这是模式的核心部分,它作为表示层和业务服务层之间的代理。业务代表对象知道如何访问业务服务,并提供与业务服务相似的接口给表示层。它封装了业务服务的查找、创建以及调用等操作。例如,在一个在线购物系统中,业务代表对象可能提供getProductDetails(productId)方法,用于获取指定产品的详细信息。这个方法会在内部处理与产品服务相关的复杂操作,如网络通信、数据库查询等。
  • 业务服务(Business Service):
    这是实际提供业务功能的组件,它包含了业务逻辑和数据访问逻辑。例如,在购物系统中,产品服务可能包括从数据库中获取产品信息、更新产品库存等操作。业务服务可以是一个本地的 C++ 类,也可以是通过网络访问的远程服务。
  • 表示层(Presentation Layer):
    它是用户与系统交互的界面,如桌面应用的图形界面或者网页应用的前端页面。表示层通过业务代表对象来调用业务服务,而不需要直接与业务服务打交道。这样可以使得表示层的代码更加简洁,专注于用户界面的展示和交互。例如,在购物系统的网页界面中,当用户点击查看产品详情的按钮时,JavaScript 代码可以调用业务代表对象的getProductDetails(productId)方法来获取产品信息并展示在页面上。
  • 客户端(Client):
    客户端是使用表示层的实体,可以是最终用户,也可以是其他系统。在实际应用中,客户端与表示层交互,触发表示层调用业务代表对象,进而访问业务服务。例如,在一个分布式系统中,一个外部系统作为客户端,通过 API 调用企业应用的表示层,从而间接使用业务服务。

工作原理

  • 客户端发起请求,这个请求首先到达表示层。表示层调用业务代表对象的相应方法。业务代表对象在接收到请求后,会查找并调用合适的业务服务来处理请求。业务服务完成处理后,将结果返回给业务代表对象,业务代表对象再将结果返回给表示层,最后表示层将结果展示给客户端。
  • 例如,在一个金融交易系统中,用户在交易界面(表示层)发起查询账户余额的请求。交易界面调用业务代表对象的getAccountBalance(accountId)方法。业务代表对象查找并调用金融服务中的账户余额查询服务(业务服务)。金融服务查询数据库并计算账户余额,将结果返回给业务代表对象。业务代表对象把余额结果返回给交易界面,交易界面将余额显示给用户。

代码示例

假设我们有一个简单的图书管理系统。

  • 业务服务类 - 图书服务(BookService)
class BookService {
public:std::string getBookDetails(int bookId) {// 假设这里是从数据库或者其他数据源获取图书详细信息的复杂逻辑// 为了简单起见,我们直接返回一个模拟的字符串return "图书" + std::to_string(bookId) + "的详细信息";}
};
  • 业务代表类 - 图书业务代表(BookBusinessDelegate)
class BookBusinessDelegate {
private:BookService* bookService;
public:BookBusinessDelegate() {bookService = new BookService();}std::string getBookDetails(int bookId) {return bookService->getBookDetails(bookId);}
};
  • 表示层类 - 图书展示(BookPresentation)
class BookPresentation {
private:BookBusinessDelegate* delegate;
public:BookPresentation() {delegate = new BookBusinessDelegate();}void showBookDetails(int bookId) {std::string details = delegate->getBookDetails(bookId);std::cout << details << std::endl;}
};
  • 客户端使用示例
int main() {BookPresentation presentation;presentation.showBookDetails(123);return 0;
}

优点

  • 解耦表示层和业务服务层:
    表示层不需要了解业务服务的具体实现细节,包括其位置(本地或远程)、调用方式等。这样可以使得表示层的代码更加独立,易于维护和修改。例如,在一个分布式系统中,如果业务服务从本地服务变为远程服务,只需要修改业务代表对象的实现,而表示层的代码可以保持不变。
  • 提高可维护性和可扩展性:
    业务代表对象封装了业务服务的访问逻辑,可以在一个地方进行维护和扩展。例如,如果需要添加新的业务服务或者修改现有业务服务的调用方式,只需要在业务代表对象中进行操作。同时,对于表示层的开发人员来说,他们可以更加专注于用户界面的开发,而不用担心业务服务的复杂性。
  • 便于代码复用:
    业务代表对象可以在多个表示层组件中复用。例如,在一个企业应用中,不同的用户界面模块(如桌面应用和移动应用)都需要访问相同的业务服务,它们可以共享同一个业务代表对象,提高了代码的复用性。

缺点

  • 增加了额外的复杂度:
    引入业务代表对象增加了系统的层次结构,对于简单的应用来说,可能会显得过于复杂。而且,业务代表对象需要正确地封装业务服务的访问逻辑,如果设计不当,可能会导致错误或者性能问题。
  • 可能引入性能开销:
    由于业务代表对象在表示层和业务服务层之间起到代理作用,每次请求都需要经过业务代表对象的处理,可能会引入一定的性能开销,特别是在对性能要求极高的应用场景中,这一点需要特别注意。

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

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

相关文章

4.4 JMeter 请求参数类型详解

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 参数&#xff08;键值对形式&#xff09;2 消息体数据&#xff08;JSON/XML 格式&#xff09;3 文件上传 前言 在使用 JMeter 进行接口测试时&#xff0c;常见的请求参数类型主…

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…

Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)

目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划&#xff08;ERP&#xff09;系统。它提供了广泛的功能&#xff0c;包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性&#xff0c;允许用户根据业务需求…

路由传参、搜索、多选框勾选、新增/编辑表单复用

前言&#xff1a; 记录添加运动员页面功能的具体实现 ①由赛事管理页面跳转时路由传参&#xff08;携带该页面表格中莫某条数据对应的赛事id到另一个页面&#xff09;&#xff1b; ②搜索框实时搜索&#xff1b; ③多选框勾选搜索&#xff1b; ④新增表单和编辑表单复用&a…

【11-20期】Java面试进阶:深入解析核心问题与实战案例

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java面试进阶&#xff1a;深入解析11-20期核心问题与实战案例 摘要&#xff1a; 本篇…

Java后端如何进行文件上传和下载 —— 本地版

简介&#xff1a; 本文详细介绍了在Java后端进行文件上传和下载的实现方法&#xff0c;包括文件上传保存到本地的完整流程、文件下载的代码实现&#xff0c;以及如何处理文件预览、下载大小限制和运行失败的问题&#xff0c;并提供了完整的代码示例。 大体思路 1、文件上传 …

基于SpringBoot的工程教育认证的计算机课程管理系统【附源码】

基于SpringBoot的工程教育认证的计算机课程管理系统 效果如下&#xff1a; 系统登录页面 教师主页面 学生管理页面 课程信息页面 通知公告页面 学生课程管理页面 学生课程信息页面 研究背景 随着信息技术的快速发展&#xff0c;计算机课程管理系统的应用在教育领域变得愈发重…

适用于学校、医院等低压用电场所的智能安全配电装置

引言 电力&#xff0c;作为一种清洁且高效的能源&#xff0c;极大地促进了现代生活的便捷与舒适。然而&#xff0c;与此同时&#xff0c;因使用不当或维护缺失等问题&#xff0c;漏电、触电事件以及电气火灾频发&#xff0c;对人们的生命安全和财产安全构成了严重威胁&#xf…

如何编写一个 Vue 3 应用:模板插值示例

Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;用于构建用户界面。在本篇博客中&#xff0c;我们将通过一个简单的示例来学习如何使用 Vue 3 创建一个基本的应用。这个示例将展示如何使用 Vue 的模板插值和事件处理来构建一个简单的点击计数器。 步骤 1: 准备工作 首先&…

PostgreSQL详细安装教程

#安装PostgreSQL的yum仓库 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm#安装PostgreSQL 15版本 sudo yum install -y postgresql15-server#初始化数据库&#xff08;若要自定义数据库存储目录…

uniapp中使用Mescroll实现下拉刷新与上拉加载项目实战

如何在UniApp中使用Mescroll实现下拉刷新与上拉加载 前言 下拉刷新和上拉加载更多成为了提升用户体验不可或缺的功能。UniApp作为一个跨平台的应用开发框架&#xff0c;支持使用Vue.js语法编写多端&#xff08;iOS、Android、H5等&#xff09;应用。Mescroll作为一款专为Vue设…

js:基础

js是什么 JavaScript是一种运行在客户端的编程语言&#xff0c;实现人机交互的效果 js只要有个浏览器就能跑 js可以做网页特效、表单验证、数据交互、服务端编程 服务端编程是前端人拿他们特有的后端语言node.js来干后端干的事情 js怎么组成 JavaScriptECMAScript(语言基…

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#xff0c;无法连接&#xff0c;需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…

35 基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DAC0832和ADC0832检测电压&#xff0c;0到8.5V&#xff0c;设计复位电路 LED管显示实际稳压值&#xff0c;初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

Python基础学习-11函数参数

1、"值传递” 和“引用传递” 1&#xff09;不可变的参数通过“值传递”。比如整数、字符串等 2&#xff09;可变的参数通过“引用参数”。比如列表、字典。 3&#xff09;避免可变参数的修改 4&#xff09;内存模型简介 2、函数参数类型 1&#xff09; def func() #无参…

深入理解注意力机制(Attention Mechanism)

在深度学习中&#xff0c;“注意力机制&#xff08;Attention Mechanism&#xff09;”是近年来的一个重要突破。它最初被提出用于处理自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;但如今已经广泛应用于计算机视觉、强化学习和其他领域。注意力机制赋予模型一种“…

linux-FTP服务器配置

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09; 一种用于在计算机网络中传输文件的标准协议。它允许用户通过客户端程序与远程服务器进行文件交换&#xff0c;支持文件的上传、下载、删除、重命名等操作。FTP服务常用于将网站文件上传到服务器&am…

蓝网科技临床浏览系统存在SQL注入漏洞

漏洞描述 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统&#xff0c;主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。在deleteStudy.php中的接口处存在SQL注入漏洞&#xff0c;未经身份验证的恶意攻击者利用 SQL 注入漏洞获取数据库中的…