[15] Message Chains (过度耦合的消息链)

如果你看到用户向一个对象请求另一个对象, 然后再向后者请求另一个对象, 然后再请求另一个对象.......... 这就是消息链条.

实际代码中你看到的可能是一长串getThis()或一长串临时变量. 采取这种方式, 意味着客户代码将与查询工程中的导航结构紧密耦合. 一旦对象间的关系发生了任何变化, 客户端就不得不做出相应修改.

这时候你应该使用 Hide Delegate(隐藏委托关系). 你可以在消息链的不同位置进行这种重构手法. 理论上可以重构消息链条上的任何一个对象, 但是这么做往往会把一系列对象都变成Middle Man. 通常更好的选择是: 先观察消息链条最终得到的对象是用来干什么的, 看看能否以Extract Method(提炼方法) 把使用改对象的代码提炼到一个独立的函数中, 在运用Move Method(移动方法) 把这个函数推入消息链条. 如果这条链上的某个对象有多位客户打算航行此航线的剩余部分, 就加一个函数来做这件事.

有些人把任何消息链都视为坏东西, 我们不这样想. 记住:

具体问题具体分析

Tips:

Hide Delegate(隐藏委托关系)

class Person {
    Department _department;

    public Department getDepartment(){
        return _department;
    }

    public void setDepartment (Department arg){
        _department = arg;
    }
    
}

class Department{
    private String _chargeCode;
    private Person _manager;

    public Department (Person manager){
        _manager = manager;
    }

    public Person getManager{
        return _manager;
    }

}

如果客户希望知道某人的经历是谁, 他必须先获得Department对象:

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

这样的编码就对客户端揭露了Department的工作原理, 于是客户知道:Department用以追踪"经理" 这条信息. 如果对客户端隐藏Department, 可以减少耦合. 为了这一目的, 我在Person中建立一个简单的委托函数:

public Person getManager(){
    return _department.getManager();
}

现在,我需要修改Person的所有客户, 让它们改用新函数:

manager = john.getManager();

只要完成了对Department所有函数的委托关系, 并相应修改了Person的所有客户, 我就可以移除Person中的访问函数getDepartment()函数了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,609评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 9,358评论 3 14
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,413评论 2 17
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 10,492评论 0 13

友情链接更多精彩内容