前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 -- 迪米特法则

设计模式 -- 迪米特法则

作者头像
xy_ss
发布2023-11-22 09:20:26
1040
发布2023-11-22 09:20:26
举报
文章被收录于专栏:浮躁的喧嚣

表述(降低耦合)

第一表述:一个对象应该对其他对象保持最少了解, 通俗的讲就是一个类对自己依赖的类知道的越少越好,也就是对于被依赖的类,向外公开的方法应该尽可能的少

第二表述:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用

优点

对象之间的耦合降到最小,符合高内聚低耦合的特性

示例

需求V1(第一表述):当我们按下计算机的关机按钮的时候,计算机会执行一些列的动作会被执行:比如保存当前未完成的任务,然后是关闭相关的服务,接着是关闭显示器,最后是关闭电源,这一系列的操作以此完成后,计算机才会正式被关闭

代码语言:javascript
复制
class Computer{
    func saveData() {
    }
    func closeService() {
    }
    func closeScreen() {
    }
    func closePower() {
    }
    func close() {
        self.saveData()
        self.closeService()
        self.closeScreen()
        self.closePower()
    }
}

class Person{
    
    func closeComputer() {
        let c = Computer()
        
        c.saveData()
        c.closeService()
        c.closeScreen()
        c.closePower()
        
        //或是
        c.saveData()
        c.close()
        
        //....
    }
}

可以看到closeComputer()方法中,我们发现这个方法无法编写:c是一个完全暴露的对象,其方法是完全公开的,那么对于Person来说,当他想要执行关闭的时候,却发现不知道该怎么操作:该调用什么方法?靠运气猜么?如果Person的对象是个不按常理出牌的,那这个Computer的对象岂不是要被搞坏么?

遵循迪米特法则,只应该暴露应该暴露的方法

代码语言:javascript
复制
class Computer{
    
    private func saveData() {
    }
    private func closeService() {
    }
    private func closeScreen() {
    }
    private func closePower() {
    }
    func close() {
        self.saveData()
        self.closeService()
        self.closeScreen()
        self.closePower()
    }
}

class Person{
    
    func closeComputer() {
        let c = Computer()
        c.close()
        
    }
}

需求V2(第二表述):计算机包括操作系统和相关硬件,我们可以将其划分为System对象和Container对象。当我们关闭计算机的时候,本质上是向操作系统发出了关机指令,而实则我们只是按了一下关机按钮,也就是我们并没有依赖System的对象,而是依赖了Container。这里Container就是我们上面所说的直接朋友---只和直接朋友通信

代码语言:javascript
复制
protocol SystemProtocol{
    func close()
}
class System : SystemProtocol{
    
    private func saveData() {
    }
    private func closeService() {
    }
    private func closeScreen() {
    }
    private func closePower() {
    }
    func close() {
        self.saveData()
        self.closeService()
        self.closeScreen()
        self.closePower()
    }
}

class Container{
    func sendCloseCommand() {
        let system = System()
        system.close()
    }
}

class People{
    func closeComputer() {
        let c = Container()
        c.sendCloseCommand()
    }
}

从上面看到,和依赖倒置原则相结合之后的设计,也是符合迪米特原则的:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用,这里的第三者就是接口SystemProtocol

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表述(降低耦合)
  • 优点
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档