迪米特法則(Law of Demeter)又叫作最少知識原則(Least Knowledge Principle 簡寫LKP),就是說一個對象應當對其他對象有儘可能少的瞭解,不和陌生人說話。這樣就能有效降低耦合了。
特點:
1、只和“朋友”聯繫
2、就算是“朋友”也要少建立聯繫
用途:
降耦
實例分析:
1、只和“朋友”聯繫,那這裏的“朋友”是什麼呢?“朋友”是指成員變量、函數參數、或函數返回值!舉個例子:
客戶找裝修公司爲其裝修房子,裝修公司委派一名工人前去裝修。
class Worker
{
public:
void Decorate();
};
class Company
{
public:
Worker* regist();
};
class Clientele
{
public:
void Decorate(const Company* com)
{
Worker* worker = com->regist();
worker->Decorate();
}
};
代碼中涉及到三個類裝修工人Worker、裝修公司Company、僱主Clientele。再來分析一下他們的關係Company是Clientele的“朋友”,Worker是Company的“朋友”,但Worker並非是Clientele的朋友。
有了上面的關係,不難看出,這段代碼違背了迪米特法則!因爲Clientele與非“朋友”類Worker有了聯繫!所以要對這段代碼進行修改:
class Worker
{
public:
void Decorate();
};
class Company
{
public:
void Decoreate()
{
Worker* worker = regist();
worker->Decorate();
}
Worker* regist();
};
class Clientele
{
public:
void Decorate(const Company* com)
{
com->Decorate();
}
};
現在Clientele只和“朋友”Company聯繫,同樣Company只和“朋友”Worker聯繫。雖然滿足了迪米特法則的第一步,但仍然違背了第二步:和“朋友”也要少建立聯繫!再次對代碼進行修改,修改Company的regist方法的訪問級別
class Worker
{
public:
void Decorate();
};
class Company
{
public:
void Decoreate()
{
Worker* worker = regist();
worker->Decorate();
}
private:
Worker* regist();
};
class Clientele
{
public:
void Decorate(const Company* com)
{
com->Decorate();
}
};
OK,到這裏爲止,就可以根據迪米特法則,將原方案中的耦合降到最低了!