【迪米特法则 - 六大设计原则 - 设计模式】

285 阅读2分钟

迪米特法则(Law Of Demter)

定义:迪米特法则又叫最少知识原则,指的是一个类/模块对其他的类/模块有越少的了解越好。简单来说就是:只和最亲密的朋友交往,不和陌生人来往。

迪米特思想就是:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口

如果两个软件实体无需直接通信,那么就不应当发生直接的互相调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

场景示例

明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。

截屏2023-01-11 22.07.16.png

迪米特法则的独特之处在于它简洁而准确的定义,它允许在编写代码时直接应用,几乎自动地应用量适当的封装、高内聚和低耦合。 但是,过度使用迪米特法则则会使系统产生大量的中介类,从而增加系统的负责性,使模块之间的通信效率降低。所以,在采用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统结构清晰。

代码如下: 明星类(Star)

struct Star {
    let name: String

    init(name: String) {
        self.name = name
    }
}

粉丝类(Fans)

struct Fans {
    let name: String
    let address: String

    init(name: String, address: String) {
        self.name = name
        self.address = address
    }
}

媒体公司(Company)

struct Company {
    let name: String

    init(name: String) {
        self.name = name
    }
}

经纪人类(Agent)

struct Agent {
    let star: Star
    let fans: Fans
    let company: Company

    init(start: Star, fans: Fans, company: Company) {
        self.star = start
        self.fans = fans
        self.company = company
    }

    func metting() {
        print("\(fans.name)与明星\(star.name)见面了")
    }

    func business() {
       print("\(company.name)与明星\(star.name)洽谈业务")
    }
}

测试类

let agent = Agent(
    start: Star(name: "Kare")
    fans: Fans(name: "peng", address: "天街八号"),
    company: Company(name: "天宝传媒集团")
    ) 
    
agent.business()
agent.metting()

Law Of Demter