码迷,mamicode.com
首页 > 其他好文 > 详细

迪米特原则-带你走进梦幻西游(三)

时间:2016-05-07 08:03:59      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

转载请标明: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;
}

总结:
在应用开发过程中,最难的不是完成应用的开发工作,而是后续的升级,维护过程中能让开发人员更容易进行扩展

迪米特原则-带你走进梦幻西游(三)

标签:

原文地址:http://blog.csdn.net/liulongling/article/details/51332685

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!