在游戏玩家寻找自己喜欢的游戏类型的场景中,程序员往往会这样设计客户端:
class Game
{
public:
virtual void result() = 0;
};
class Game1:public Game
{
public:
Game1()
{
_name = "黑暗之魂";
_Type = "魂类";
}
virtual void result()
{
cout << _name << endl;
}
string _Type;
string _name;
};
class Game2 :public Game
{
public:
Game2()
{
_name = "原神";
_Type = "开放世界";
}
virtual void result()
{
cout << _name << endl;
}
string _Type;
string _name;
};
void test2()
{
Game1* g1 = new Game1();
Game2* g2 = new Game2();
if (g1->_Type == "魂类")
g1->result();
if (g2->_Type == "魂类")
g2->result();
}
int main()
{
test2();
return 0;
}
但是这样设计不是最佳。因为定义一个对象应该对其他对象保持最少的了解。 狭义的迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。 如果其中一个类需要调用另一类的某一个方法的话,可以通过第三者转发这个调用。 广义的迪米特法则:一个模块设计的好坏的一个重要标志就是该模块在多大程度上讲自己的内部数据与实现的有关细节隐藏起来。换言之:我不需要与每个类进行打交道,我只关心最终给我返回的结果:
class Game
{
public:
virtual void result() = 0;
virtual string gettype() = 0;
};
class Game1:public Game
{
public:
Game1()
{
_name = "黑暗之魂";
_Type = "魂类";
}
virtual void result()
{
cout << _name << endl;
}
virtual string gettype()
{
return _Type;
}
string _Type;
string _name;
};
class Game2 :public Game
{
public:
Game2()
{
_name = "原神";
_Type = "开放世界";
}
virtual void result()
{
cout << _name << endl;
}
virtual string gettype()
{
return _Type;
}
string _Type;
string _name;
};
class mediator
{
public:
mediator()
{
Game1* g1 = new Game1();
_v.push_back(g1);
Game2* g2 = new Game2();
_v.push_back(g2);
}
~mediator()
{
for (auto& it : _v)
{
delete it;
}
}
void findGame(string need)
{
for (auto& it : _v)
{
if ((*it).gettype() == need)
{
(*it).result();
}
}
}
vector<Game*> _v;
};
void test2()
{
mediator* me = new mediator();
me->findGame("魂类");
me->findGame("开放世界");
}
int main()
{
test2();
return 0;
}