当前位置: 首页 > article >正文

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

重构对象-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.kler.cn/a/979.html

相关文章:

  • Vue Diff 算法完全解析
  • redis缓存篇知识点总结
  • Nginx代理同域名前后端分离项目的完整步骤
  • 特制一个自己的UI库,只用CSS、图标、emoji图 第二版
  • 一 rk3568 Android 11固件开发环境搭建 (docker)
  • Rust调用Windows API制作进程挂起工具
  • 漫画:什么是快速排序算法?
  • 一文读懂Js中的this指向
  • 像ChatGPT玩转Excel数据
  • 前端性能优化之HTTP缓存
  • vue以及前端css组件
  • 【C++笔试强训】第三十二天
  • [pytorch]thop计算模型算力和参数量
  • 【深度解刨C语言】符号篇(全)
  • Spring Cloud(微服务)学习篇(五)
  • 【Linux】网络编程套接字(下)
  • 【Python入门第三十三天】Python 字符串格式化
  • 普通Java工程师 VS 优秀架构师
  • Docekr三剑客之 Docekr compose
  • python 内置函数和多线程
  • 手把手学会DFS (递归入门)
  • Python直接复制已有的venv虚拟环境以创建新的虚拟环境
  • 【巨人的肩膀】JAVA面试总结(六)
  • C++继承[万字详解]
  • new Function 得到的都是匿名函数,怎么得到一个具名函数对象?
  • TCP UDP详解