第2章 面向对象的设计原则(SOLID):5_迪米特法则
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_迪米特法则的更多相关文章
- 第2章 面向对象的设计原则(SOLID):3_依赖倒置原则(DIP)
3. 依赖倒置原则(Dependence Inversion Principle,DIP) 3.1 定义 (1)要依赖抽象,不要依赖具体的实现类.简单的说就是对抽象(或接口)进行编程,不要依赖实现进行 ...
- 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)
4. 接口隔离原则(Interface Segregation Principle,ISP) 4.1 定义 (1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口.类间的 ...
- 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)
2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...
- 第2章 面向对象的设计原则(SOLID):6_开闭原则
6. 开闭原则(Open Closed Principle,OCP) 6.1 定义 (1)一个类应该对扩展开放,对修改关闭.要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己 ...
- 第2章 面向对象的设计原则(SOLID):1_单一职责原则(SRP)
1. 单一职责原则(Single Responsibility Principle,SRP) 1.1 单一职责的定义 (1)定义:一个类应该仅有一个引起它变化的原因.这里变化的原因就是所说的“职责”. ...
- [设计模式]面向对象五大设计原则:SOLID
SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...
- 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...
- Java 面向对象的设计原则
一. 1.面向对象思想的核心: 封装.继承.多态. 2.面向对象编程的追求: 高内聚低耦合的解决方案: 代码的模块化设计: 3.什么是设计模式: 针对反复出现的问题的经典解决方案,是对特定条件下( ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
随机推荐
- Visual Studio 2013下JSON可视化工具
Visual Studio 2013现在我们有个小工具可以实现JSON可视化,这样给我们调试JSON提供了便利. JSON这种数据格式已经比较流行,在WEB前端随处可见. 在你需要安装VS ...
- 跨平台的 SQL 客户端
The major update to SQL client was to move to the .NET Core networking libraries instead of the nati ...
- NYOJ 1058 部分和问题
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- 一些arcgis符号库干货
分享一些arcgis符号库干货,自己也可以参考网上的教程自己做,但尽量要符合标准规范. 下面是一些符号示例(并不一定是官方标准的): 土地利用总体规划图 水土保持图 1:5万土地利用现状 1:1万地形 ...
- arcgis union 0x80040218
我利用ArcGis中的union工具将两张图层叠加时,系统总是提示失败,这是什么原因?希望高手能够解决这个问题.图片是系统提示,表示看不懂哪里出错了? 你必须使用数据管理-要素-修复几何,源数据存在不 ...
- Fix Internet Explorer Crashes with SharePoint 2013 Online Presence Indicators
IE中,只要是鼠标浮动到人名字上面的状态的时候,这个状态是与Lync相连接的,IE就会出现停止工作. 以下是解决方法. Until the other day when I figured this ...
- Thread.CurrentPrincipal & HttpContext.Current.User
据说要这样写才稳妥 // This principal will flow throughout the request.VoyagerPrincipal principal = new Voyage ...
- JAVA基础学习day14--集合一
一.集合的出现 1.1.集合简述 面向对象语言对事物的体现都是以对象形式,为了方便对多个对象的操作,就对象对象进行存储,集合就是存仪储对象最常用的一种试 1.2.数组和集合都是容器 数组也存对象,存储 ...
- HTML5 -1- 简介
在介绍HTML5之前我们应该先了解一下HTML5 我想从下面开始简单了解一下HTML5 什么是HTML5??? HTML5 即HTML 5.0 版本 正式制定时间是在2014年 遵循着移动先行(前四个 ...
- iOS开源JSON解析库MJExtension
iOS中JSON与NSObject互转有两种方式:1.iOS自带类NSJSONSerialization 2.第三方开源库SBJSON.JSONKit.MJExtension.项目中一直用MJExte ...