下面以“明星与经纪人的关系实例”为例来说明迪米特法则原则的应用(工程源码)
分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图 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)功能。
参考: