一、迪米特原则概念
迪米特原则:一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解
举个例子,你要租房,如果深圳有很多房子,你一个一个地去看,那么就会很累,从程序的角度上看耦合性会很强,也就是说,你要一个一个去访问房源A,房源B。。。
反之,如果通过中介,告诉他你的要求,他会帮你筛选出符合你要求的房子,这样你不用知道各种房子的信息就能获得你想要的结果。
二、例子
中介类需要经常去收集房产信息,维护和管理这些信息,这样租客就能通过中介去了解更多的房源信息
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class AbstractBuilding {
public:
virtual string getQuality() = 0;
virtual string getValue() = 0;
virtual string getDistance() = 0;
virtual string whichbuilding() = 0;
};
class BuildingA : public AbstractBuilding{
public:
BuildingA(string quality, string value, string dis) :
_quality(quality),
_value(value),
_distance(dis) {}
virtual string getQuality() override {
return _quality;
}
virtual string getValue() override {
return _value;
}
virtual string getDistance() override {
return _distance;
}
virtual string whichbuilding() override {
return "A";
}
private:
string _quality;
string _value;
string _distance;
};
class BuildingB : public AbstractBuilding {
public:
BuildingB(string quality, string value, string dis) :
_quality(quality),
_value(value),
_distance(dis) {}
virtual string getQuality() override {
return _quality;
}
virtual string getValue() override {
return _value;
}
virtual string getDistance() override {
return _distance;
}
virtual string whichbuilding() override {
return "B";
}
private:
string _quality;
string _value;
string _distance;
};
class Mediator {
public:
~Mediator() {
//for (auto p = _vBuilding.begin(); p != _vBuilding.end(); ++p) {
// delete *p;
//}
for (auto p : _vBuilding)
delete p;
}
void AddBuilding(AbstractBuilding* building) {
_vBuilding.push_back(building);
}
AbstractBuilding* FindBuilding(string quality, string value, string dis) {
for (auto pbuilding : _vBuilding) {
if (pbuilding->getQuality() == quality &&
pbuilding->getValue() == value &&
pbuilding->getDistance() == dis) {
return pbuilding;
}
}
return nullptr;
}
private:
vector<AbstractBuilding*> _vBuilding;
};
void test() {
BuildingA* pa = new BuildingA("好", "便宜", "近");
BuildingB* pb = new BuildingB("差", "贵", "远");
Mediator* pm = new Mediator;
pm->AddBuilding(pa);
pm->AddBuilding(pb);
AbstractBuilding* pbuilding = pm->FindBuilding("好", "便宜", "近");
if (pbuilding != nullptr) {
cout << pbuilding->whichbuilding() << "符合要求\n";
} else {
cout << "没有符合你要求的房子\n";
}
delete pm;
//delete pb; 注意此处在 Add 方法中push的是地址, 所以这里不需要重复释放
//delete pa;
}
int main() {
test();
return 0;
}