迪米特法则又叫做最少知识原则。其核心为一个类或对象应尽可能少的与其他实体发生相互作用。起初衷是为了降低类的耦合,但是需要注意,由于要复合迪米特法则,需要创建许多额外的中介类,过多的中介类会增加系统的复杂度,有时反而可能会得不偿失。所以在使用迪米特法则的时候要慎重。
这里我们用公司的老板每天需要处理的事情为例子
class Boss{
var name : String
init(name : String) {
self.name = name
}
func dailyWork(customName : String ) { //如果老板一天内要和下面的类发生交互所执行的方法
//按照现在的设计,老板完成一天的工作需要这样做 , 并且违反迪米特法则最小的依赖原则
Customer(name: customName).talking(boss: self)
Event().meeting(boss: self)
Study().study(boss: self)
}
}
//假如公司的老板一天下来非常的忙碌,他要跟不同的人开会等等
class Customer { //顾客
var name : String
init(name : String) {
self.name = name
}
//客户与老板交谈
func talking(boss : Boss) {
print("客户\(self.name)与老板\(boss.name)")
}
}
class Event{ //老板要执行的会议类
func meeting(boss : Boss) { //要参加这个会议的老板
print("\(boss.name)参加会议")
}
}
class Study{ //老板还要进行培训学习这样的任务
func study(boss : Boss) {
print("\(boss.name)参加学习")
}
}
let boss = Boss(name: "Jack")
boss.dailyWork(customName: "Mike")
如果要Boss类尽可能地去依赖更少的类那么我们就需要一个中介类去帮Boss做这些事情
class Helper{ //中介秘书类
var boss : Boss // 秘书需要和老板进行绑定
init(boss : Boss) {
self.boss = boss
}
func work(customName : String) {
Customer(name: customName).talking(boss: self.boss)
Event().meeting(boss: self.boss)
Study().study(boss: self.boss)
}
}
此时Boss类所做的事情全部都交给了中介类来帮助实现了
class Boss{
var helper : Helper!
var name : String
init(name : String) {
self.name = name
self.helper = Helper(boss : self)
}
func dailyWork(customName : String ) {
//老板让中介类替他工作
self.helper.work(customName: customName)
}
}
咋一看来,貌似中介类的出现并没有对多依赖的场景进行优化。因为中介类与其他三个业务类的依赖依然存在,而且代码也比以前更多了,代码的复用性并没有得到很大的提升。但是如果我们做的是功能模块,加入Boss类是一个大的功能,其他三个是小的功能模块,通过中介类就可以实现更好的拆分和功能模块之间的通讯,这就是迪米特法则的重要核心。