转载请标明:http://blog.csdn.net/liulongling/article/details/51332685
面向对象其它六大原则
迪米特原则英文名称Law of Demeter,缩写LOD,也称为最少知识原则(Least Knowledge Principle).
定义
一个对象应该对其它对象有最少的了解,从而降低各个对象之间的耦合,让程序有更好的可扩展性。
为什么用迪米特原则
下面举例说明,玩梦幻西游的玩家知道可以在长安城商会购买师门宝宝或其它物品。
//
// 非迪米特原则.cpp
// c++
//
// Created by 刘龙玲 on 16/5/6.
// Copyright ? 2016年 liulongling. All rights reserved.
//
#include <iostream>
#include <string>
#include <set>
#include <list>
using namespace std;
static const string name[] = {"狂豹","律法","雷鸟人","大力金刚","吸血鬼"};
//召唤兽
class Pet
{
public:
Pet(int id,int lvl,string name)
{
this->id = id;
this->level = lvl;
this->name = name;
}
int getId()
{
return this->id;
}
int getLevel()
{
return this-> level;
}
string getName()
{
return this->name;
}
private:
int id;
int level;
string name;
};
//商会
class Commerce
{
public:
Commerce()
{
cout<<"Commerce()"<<endl;
for(int i=0;i<10;i++)
{
Pet pet(1,i+5,name[i]);
pets.push_back(pet);
}
cout<<pets.size()<<endl;
}
list<Pet> getPets()
{
return this->pets;
}
private:
list<Pet> pets;
};
class Player
{
public:
int id = 1;
int lvl = 6;
void buyPet(Commerce* commerce)
{
if(commerce == NULL)
{
return;
}
for(Pet& pet:commerce->getPets())
{
if(id == pet.getId()&& lvl == pet.getLevel())
{
cout<<"你买了只"<<pet.getName()<<endl;
break;
}
}
}
};
int main()
{
Commerce* commerce = new Commerce;
Player p;
p.buyPet(commerce);
return 0;
}
从上面的代码可以看到,玩家Player不仅依赖了商会Commerce,还要频繁与Pet类打交道。然而我们的要求只是在商会找到师傅要的宠物给他就行,不需要直接和宠物打交道,反而会把商会的功能弱化,从而导致玩家和宠物的耦合太高,因此我重新设计来结构如图:
重构的代码如下:
//
// 更好的可扩展性-迪米特原则.cpp
// c++
//
// Created by 刘龙玲 on 16/5/6.
// Copyright ? 2016年 liulongling. All rights reserved.
//
#include <iostream>
#include <string>
#include <set>
#include <list>
using namespace std;
static const string name[] = {"狂豹","律法","雷鸟人","大力金刚","吸血鬼"};
//召唤兽
class Pet
{
public:
Pet()
{
}
Pet(int id,int lvl,string name)
{
this->id = id;
this->level = lvl;
this->name = name;
}
int getId()
{
return this->id;
}
int getLevel()
{
return this-> level;
}
string getName()
{
return this->name;
}
private:
int id;
int level;
string name;
};
class AbstractGoods
{
public:
virtual Pet sell(int id,int lvl) = 0;
};
//商会
class Commerce:public AbstractGoods
{
public:
Commerce()
{
for(int i=0;i<10;i++)
{
Pet pet(1,i+5,name[i]);
pets.push_back(pet);
}
}
virtual Pet sell(int id,int lvl)
{
Pet p;
for(Pet& pet:pets)
{
if(pet.getId() == id&&pet.getLevel())
{
return pet;
}
}
return p;
}
private:
list<Pet> pets;
};
class Player
{
public:
void buyPet(int id,int lvl)
{
AbstractGoods* good = new Commerce;
Pet pet = good->sell(id,lvl);
cout<<"你买了只"<<pet.getName()<<endl;
}
};
int main()
{
Player p;
p.buyPet(1,2);
return 0;
}
总结:
在应用开发过程中,最难的不是完成应用的开发工作,而是后续的升级,维护过程中能让开发人员更容易进行扩展
时间: 2024-12-29 13:15:16