重构对象-Remove Middle Man移除中间人六

news/2024/11/29 2:31:12/

重构对象-Remove Middle Man移除中间人六

1.移除中间人

1.1.使用场景

在Hide Delegate (157)的“动机”一节中,我谈到了“封装受托对象”的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用受托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受托类的特性(功能)越来越多,这一过程会让你痛苦不已。服务类完全变成了一个“中间人”,此时你就应该让客户直接调用受托类。

很难说什么程度的隐藏才是合适的。还好,有了Hide Delegate (157)和Remove Middle Man (160),你大可不必操心这个问题,因为你可以在系统运行过程中不断进行调整。随着系统的变化,“合适的隐藏程度”这个尺度也相应改变。6个月前恰如其分的封装,现今可能就显得笨拙。
重构的意义就在于:你永远不必说对不起——只要把出问题的地方修补好就行了。

1.2.如何做

  • 建立一个函数,用以获得受托对象。
  • 对于每个委托函数,在服务类中删除该函数,并让需要调用该函数的客户转为调用受托对象。
  • 处理每个委托函数后,编译、测试。

1.3.示例

 class Person...Department _department;// 影藏了委托关系        public Person getManager() {return _department.getManager();class Department...private Person _manager;public Department (Person manager) {_manager = manager;}

为了找出某人的经理,客户代码可能这样写

manager = john.getManager();

像这样,使用和封装Department都很简单。
但如果大量函数都这么做,我就不得不在Person之中安置大量委托行为(delegations)。这就是移除中间人的时候了。 首先在Person建立一个「受托对象(delegate)取得函数」:

 class Person...public Department getDepartment() {return _department;}

然后逐一处理每个委托函数。针对每一个这样的函数,我要找出通过Person使用的函数,并对它进行修改,使它首先获得受托对象(delegate),然后直接使用之:

 manager = john.getDepartment().getManager();

然后我就可以删除Person的getManager() 函数。如果我遗漏了什么,编译器会 告诉我。为方便起见,我也可能想要保留一部分委托关系(delegations)。此外我也可能希望对某些客户隐藏委托关系,并让另一些用户直接使用受托对象。基于这些原因,一些简单的委托关系(以及对应的委托函数)也可能被留在原地。


http://www.ppmy.cn/news/32687.html

相关文章

PyTorch 神经网络搭建模板

1. Dataset & DataLoader🍁 在 PyTorch 中,Dataset 和 DataLoader 是用来处理数据的重要工具。它们的作用分别如下: Dataset: Dataset 用于存储数据样本及其对应的标签。在使用神经网络训练时,通常需要将原始数据集…

【K8S系列】从零开始学习 k8s:入门指南(二)

目录 序言 前情提要: 4.K8S架构 4.1 声明式系统VS命令式系统 4.2 k8s-声明式系统 4.2.1 声明方式-yaml 4.3 Kubernetes的基本概念 1.集群 2.节点 3.容器 4.Pod 5.Service 6.Deployment 问题: 4.4 K8S核心组件 4.4.1 kube-apiserver 4.4…

彻底理解Session、Cookie、Token,入门及实战

文章目录Session Cookie的使用Token的使用Session Cookie的使用 1. Session存储数据 HttpSession session request.getSession(); //Servlet底层通过的SESSIONID,获取Session对象。 session.setAttribute("loginTime",new Date()); out.println(&q…

ChatGPT新进展GPT-4 模型介绍

文章目录背景工具功能使用增强背景 2023.3.14 GPT-4 模型发布 创建了GPT-4,这是OpenAI在扩大深度学习方面的最新里程碑。GPT-4是一个大型多模态模型(接受图像和文本输入,输出文本输出),虽然在许多现实场景中不如人类,但在各种专业…

Unity AR应用(人脸识别)手把手教程

Unity官方有个教程,照着一步一步操作,就能做出一个典型的AR应用:人脸识别虚拟穿戴。其实,人脸识别和跟踪都是设备平台实现的功能(如Android的ARCore或iOS的ARKit),在Unity里只是进行配置工作。真…

RK3568平台开发系列讲解(网络篇)使用socket建立TCP连接

文章目录 一、服务端1.1、socket: 创建套接字1.2、bind: 设定电话号码1.3、listen: 接上电话线,一切准备就绪1.4、accept: 电话铃响起了二、客户端三、TCP 三次握手🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将分别从服务端和客户端的…

计算机网络的基本组成

计算机网络是由多个计算机、服务器、网络设备(如路由器、交换机、集线器等)通过各种通信线路(如有线、无线、光纤等)和协议(如TCP/IP、HTTP、FTP等)互相连接组成的复杂系统,它们能够在物理层、数…

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够,懂技术/懂业务/懂管理的综合型人才,才是技术团队中的绝对核心。 不仅仅是架构师,所有的技术高端岗位,对人才的综合能力都有较高的标准。 架构路线的总设计师 规…