下面以“明星與經紀人的關係實例”爲例來說明迪米特法則原則的應用(工程源碼)
分析:明星由於全身心投入藝術,所以許多日常事務由經紀人負責處理,如與粉絲的見面會,與媒體公司的業務洽淡等。這裏的經紀人是明星的朋友,而粉絲和媒體公司是陌生人,所以適合使用迪米特法則,其類圖如圖 1 所示。
圖1 明星與經紀人的關係圖
#include <QCoreApplication>
#include <iostream>
/*!
* \brief Star class
*/
class Star{
public:
void SetName(std::string name){
this->_star_name =name;
}
std::string GetName(void){
return this->_star_name;
}
private:
std::string _star_name;
};
/*!
* \brief The Fans class
*/
class Fans {
public:
void SetName(std::string name){
this->_fans_name = name;
}
std::string GetName(void){
return this->_fans_name;
}
private:
std::string _fans_name;
};
/*!
* \brief The Company class
*/
class Company{
public:
void SetName(std::string name){
this->_company_name = name;
}
std::string GetName(void){
return this->_company_name;
}
private:
std::string _company_name;
};
/*!
* \brief The Agent class
*/
class Agent{
public:
void SetStar(Star &myStar){
this->myStar = myStar;
}
void SetFans(Fans &myFans){
this->myFans = myFans;
}
void SetCompany(Company &myCompany){
this->myCompany = myCompany;
}
void Meeting(void){
std::cout<< this->myStar.GetName()+" "+this->myFans.GetName() << std::endl;
}
void Business(void){
std::cout<< this->myStar.GetName()+" "+this->myCompany.GetName() << std::endl;
}
private:
Star myStar;
Fans myFans;
Company myCompany;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Agent *myAgent = new Agent;
Star myStar;
myStar.SetName(std::string("Lili"));
Fans myFans;
myFans.SetName(std::string("mimi"));
Company myCompany;
myCompany.SetName(std::string("chuanmei"));
myAgent->SetStar(myStar);
myAgent->SetCompany(myCompany);
myAgent->SetFans(myFans);
myAgent->Meeting();
myAgent->Business();
return a.exec();
}
迪米特法則,又稱最少知道原則(Demeter Principle)
最少知道原則是指:一個實體應當儘量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
在運用迪米特法則時要注意以下 6 點。
- 在類的劃分上,應該創建弱耦合的類。類與類之間的耦合越弱,就越有利於實現可複用的目標。
- 在類的結構設計上,儘量降低類成員的訪問權限。
- 在類的設計上,優先考慮將一個類設置成不變類。
- 在對其他類的引用上,將引用其他對象的次數降到最低。
- 不暴露類的屬性成員,而應該提供相應的訪問器(set 和 get 方法)。
- 謹慎使用序列化(Serializable)功能。
參考: