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

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

迪米特原则-带你走进梦幻西游(三)的相关文章

小丁带你走进git的世界三-撤销修改(转)

一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 git revert 撤销本次提交. 二.指令讲解 Git checkout 首先我们对文件的一个修改,对master.txt进行了修改 修改结果我们利用上面的知识来进行查看. 新增加了Test这么一段话,如果我们想要将工作区的内容添加到暂存区会使用git  add这个命令,如果我们想要还原工作区内容

【密码学】一万字带您走进密码学的世界(下)

引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 在<一万字带您走进密码学的世界(上)>的文章中我们探讨了对称密码体系,哈希函数等技术,本文继续探讨密码学剩余的部分,本文的主要内容包括,非对称密码体系,签名算法等,因为本部分是区块链技术的基石,所以我会讲的更加详细一点,虽然我已经尽最大努力使思想简化,但是其中的数学理论对于很多人还是很晦涩,建议读者开始之前先读下数论的有关

带你走进虚拟化世界之kvm(转载)

http://chuck.blog.51cto.com/10232880/1720953 带你走进虚拟化世界之kvm 2015-12-08 23:10:46 标签:云计算 虚拟化 kvm 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chuck.blog.51cto.com/10232880/1720953 一.走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算

带你走进虚拟化世界之KVM

带你走进虚拟化世界之KVM 一.走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互. 1.1 云计算的特点和优势 1)云计算是一种使用模式 2)云计算必须通过网络访问 3)弹性计算,按需付费 1.2 在云计算之前的模式或技术 1)IDC托管 2)IDC租用 3)虚拟主机(卖空间的) 4)vps:虚拟专

小牛带你走进Spring的事务

摘要本文摘抄了Spring事务相关的一些理论,主要讲述事务的特性.事务的传播行为.事务的隔离规则. 关键词:事务特性,事务传播,事务隔离 一.什么是事务事务是用来保证数据的完整性和一致性,正如金钱转账,金钱总数不会增加也不会减少. 数据库 事务管理有四个特性(ACID): 特性描述原子性(Atomicity)事务作为一个整体被执行,要么全部被执行,要么都不执行.一致性(Consistency)事务应确保数据的状态从一个一致状态转变为另一个一致状态,数据不应该被破坏.隔离性(Isolation)多

6.EVE-NG网卡桥接,带您走进更高级的实验

文章列表(关注微信公众号EmulatedLab,及时获取文章以及下载链接) 1.EVE-NG介绍(EVE-NG最好用的模拟器,仿真环境时代来临!) 2.EVE-NG安装过程介绍 3.EVE-NG导入Dynamips和IOL 4.EVE-NG导入QEMU镜像 5.EVE-NG关联SecureCRT,VNC,Wireshark 6.EVE-NG网卡桥接,带您走进更高级的实验 7.EVE-NG硬盘扩容,存储海量镜像 8.EVE-NG定制个人镜像,脚本快速导入 9.EVE-NG容纳H3C.Huawei,

小心公共wifi 之小白客带你走进黑客世界:kali linux下的无线攻击技术

本文标签: 黑客世界 wifi安全 无线攻击技术 公共wifi不安全 kali+linux 原文地址:http://whosmall.com/?post=460 我们常说公共wifi不安全,那么到底不安全在哪些地方呢?当不怀好意者和你同在一个wifi下,你的手机或者笔记本会被监听吗?除了上网被监视以外,还会产生什么不好的后果?介于小伙伴们对于wifi这一块比较感兴趣,在这篇文章里,就先为大家普及一下在公共wifi下究竟有多危险. 实验环境 一台装有kali linux的笔记本(模拟攻击者)ip地

GDI+入门——带你走进Windows图形的世界

一.GDI+基础 1.GDI+简介 GDI+是微软的新一代二维图形系统,它完全面向对象,要在Windows窗体中显示字体或绘制图形必须要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象,此外还包括一些新的绘图功能,比如渐变.除锯齿.纹理等. GDI+包括三部分:二维矢量图形的绘制.图像处理和文字显示.GDI+使用的各种类大都包含在命名空间system::Drawing中. 2.常用的数据结构 在使用GDI+显示文字和绘制图形时,需要用到一些数据结构,例如Size.Point.Recta

Xsolla带你走进印度移动游戏市场

作为世界上人口第二大国的印度,随着移动时代的到来,越来越多的开发者将目光瞄准了这个国家,今天Xsolla就带领大家一起来了解这样一个新兴的移动游戏市场. 印度移动市场潜力巨大 作为世界四大宗教和数字系统的发源地,板球和美食之国,印度移动游戏产业亦发展迅猛:该国智能手机用户迄今已逾9.4亿,4G覆盖面正迅速铺开.最新数据显示,2014年底,印度的智能手机用户总数量将超过澳大利亚.德国.韩国.台湾和英国人口总数.最近的数据预测显示,今年印度的智能手机总数也将超过美国,当然这一数据还有待考究.印度在国