5. 迪米特法则(Law of Demeter,LoD)

5.1 定义

(1)应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,即对其他依赖的类越少越好(不要和太多的类发生关系)。

(2)尽量不要让类和类之间建立直接的关系,这样可减少类与类之间的依赖,降低类之间的耦合。

(3)一个类应对自己需要耦合的类知道得最少,只知道其public方法,其内部如何复杂自己没有关系,也叫最少知识原则(Least Knowledge Principle,LKP)。

5.2 迪米特法则:核心要义就是类间解耦、低耦合

(1)只和直接朋友交流

  ①直接朋友的定义:出现在成员变量、方法的输入参数和返回值的类称为朋友类

  ②非朋友:出现在方法体内部的类

【编程实验】体育委员点名

//违反LoD的设计

//面向对象设计原则:LoD迪米特法则
//类间解耦 #include <stdio.h>
#include <list>
using namespace std; //Girl类
class Girl
{ }; //体育委员类
class GroupLeader
{
public:
//清点女生数量
void countGirls(list<Girl>& list)
{
printf("Numbers of Girls: %d\n", list.size());
}
}; //Teacher类
class Teacher
{
public:
//老师叫体育委员清点一下女生人数
void command(GroupLeader& groupLeader)
{
//方法内的类,与Teacher不是朋友关系,
//但这样的设计会使Teacher对Girl类产生依赖,违反Lod法则
list<Girl> listGirls; //初始化女生
for(int i = ; i< ; i++)
{
Girl g;
listGirls.push_back(g);//会复制一份过去
} groupLeader.countGirls(listGirls);
}
}; int main()
{
Teacher teacher;
GroupLeader groupLeader; //老师发布命令
teacher.command(groupLeader); return ;
}

//遵循LoD法则的设计

//面向对象设计原则:LoD迪米特法则
//类间解耦 #include <stdio.h>
#include <list>
using namespace std; //Girl类
class Girl
{ }; //体育委员类
class GroupLeader
{
private:
list<Girl>& listGirls;
public:
//从构造器传入全班女生
GroupLeader(list<Girl>& _list):listGirls(_list)
{ } //清点女生数量
void countGirls()
{
printf("Numbers of Girls: %d\n", listGirls.size());
}
}; //Teacher类:与Girl类解耦
class Teacher
{
public:
//老师叫体育委员清点一下女生人数
void command(GroupLeader& groupLeader)
{
groupLeader.countGirls();
}
}; int main()
{
Teacher teacher;
list<Girl> listGirls; //初始化女生
for(int i = ; i< ; i++)
{
Girl g;
listGirls.push_back(g);//会复制一份过去
} //
GroupLeader groupLeader(listGirls); //老师发布命令
teacher.command(groupLeader); return ;
}

(2)朋友间也是有距离的

//知道得太多:InstallSoftware类和Wizard的耦合太紧

//松耦合:隐藏Wizard类安装步骤的接口,降低耦合度

(3)是自己的就是自己的

  当某个方法放在本类可以,放在其他类也没错,那么根据迪米特法则,可以在不增加类间的关系,也不对本类产生负面影响,就放置在本类中

5.3 最佳实践

(1)迪米特法则的核心观念就是类间解耦、弱耦合

(2)解耦是有限度的,在实际的项目中,需要适度考虑这个原则。

第2章 面向对象的设计原则(SOLID):5_迪米特法则的更多相关文章

  1. 第2章 面向对象的设计原则(SOLID):3_依赖倒置原则(DIP)

    3. 依赖倒置原则(Dependence Inversion Principle,DIP) 3.1 定义 (1)要依赖抽象,不要依赖具体的实现类.简单的说就是对抽象(或接口)进行编程,不要依赖实现进行 ...

  2. 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)

    4. 接口隔离原则(Interface Segregation Principle,ISP) 4.1 定义 (1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口.类间的 ...

  3. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)

    2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...

  4. 第2章 面向对象的设计原则(SOLID):6_开闭原则

    6. 开闭原则(Open Closed Principle,OCP) 6.1 定义 (1)一个类应该对扩展开放,对修改关闭.要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己 ...

  5. 第2章 面向对象的设计原则(SOLID):1_单一职责原则(SRP)

    1. 单一职责原则(Single Responsibility Principle,SRP) 1.1 单一职责的定义 (1)定义:一个类应该仅有一个引起它变化的原因.这里变化的原因就是所说的“职责”. ...

  6. [设计模式]面向对象五大设计原则:SOLID

    SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...

  7. 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

    面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...

  8. Java 面向对象的设计原则

    一. 1.面向对象思想的核心: 封装.继承.多态.   2.面向对象编程的追求: 高内聚低耦合的解决方案: 代码的模块化设计: 3.什么是设计模式: 针对反复出现的问题的经典解决方案,是对特定条件下( ...

  9. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

随机推荐

  1. Visual Studio 2013下JSON可视化工具

          Visual Studio 2013现在我们有个小工具可以实现JSON可视化,这样给我们调试JSON提供了便利. JSON这种数据格式已经比较流行,在WEB前端随处可见. 在你需要安装VS ...

  2. 跨平台的 SQL 客户端

    The major update to SQL client was to move to the .NET Core networking libraries instead of the nati ...

  3. NYOJ 1058 部分和问题

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  4. 一些arcgis符号库干货

    分享一些arcgis符号库干货,自己也可以参考网上的教程自己做,但尽量要符合标准规范. 下面是一些符号示例(并不一定是官方标准的): 土地利用总体规划图 水土保持图 1:5万土地利用现状 1:1万地形 ...

  5. arcgis union 0x80040218

    我利用ArcGis中的union工具将两张图层叠加时,系统总是提示失败,这是什么原因?希望高手能够解决这个问题.图片是系统提示,表示看不懂哪里出错了? 你必须使用数据管理-要素-修复几何,源数据存在不 ...

  6. Fix Internet Explorer Crashes with SharePoint 2013 Online Presence Indicators

    IE中,只要是鼠标浮动到人名字上面的状态的时候,这个状态是与Lync相连接的,IE就会出现停止工作. 以下是解决方法. Until the other day when I figured this ...

  7. Thread.CurrentPrincipal & HttpContext.Current.User

    据说要这样写才稳妥 // This principal will flow throughout the request.VoyagerPrincipal principal = new Voyage ...

  8. JAVA基础学习day14--集合一

    一.集合的出现 1.1.集合简述 面向对象语言对事物的体现都是以对象形式,为了方便对多个对象的操作,就对象对象进行存储,集合就是存仪储对象最常用的一种试 1.2.数组和集合都是容器 数组也存对象,存储 ...

  9. HTML5 -1- 简介

    在介绍HTML5之前我们应该先了解一下HTML5 我想从下面开始简单了解一下HTML5 什么是HTML5??? HTML5 即HTML 5.0 版本 正式制定时间是在2014年 遵循着移动先行(前四个 ...

  10. iOS开源JSON解析库MJExtension

    iOS中JSON与NSObject互转有两种方式:1.iOS自带类NSJSONSerialization 2.第三方开源库SBJSON.JSONKit.MJExtension.项目中一直用MJExte ...