第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 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
随机推荐
- 小白初学ABP框架,着实累啊
这几天在学习ABP相关的知识AutoMapper ,AngularJS,Less,DI(dependencyInjection),EntityFramework code first以及相关NuGet ...
- 深入理解MySQL开发性能优化.pptx
深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.
- 每一个成功的程序员的身后都有一个--------Parse
相信好多同行都用过Parse,而正是因为Parse给我们的开发带来的极大的便利,才有了项目从零开始,到正式上线仅仅用上不到两周的时间,现在Swift还在迅速的发展,很快就会占有大量的市场,现在就就结合 ...
- 【GOF23设计模式】适配器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_适配器模式.对象适配器.类适配器.开发中场景 适配器模式 笔记本电脑只有USB接口,新买的键盘是PS2接口的,需要用适 ...
- 2013学习总结----JavaScript
javascript面向对象,实现的几种方式 1:直接使用JSON对象 var o1={ "a":1, "b":2, "c":functio ...
- 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因
转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...
- 关于制作报奖PPT的小结
从9月26日接到制作报奖材料的任务开始,6个人(不包括审查领导和美工人员)忙活了半个多月终于交稿了,翻一下时间日志,10月1日前大概投入了13个小时,10月13日交稿又讨论修改了67个小时,总共算起来 ...
- Jsoup解析Html中文文档
jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTM ...
- C标准库<ctype.h>实现
本文地址:http://www.cnblogs.com/archimedes/p/c-library-ctype.html,转载请注明源地址. 1.背景知识 ctype.h是C标准函数库中的头文件,定 ...
- System占用端口80
可尝试如下结束System进程: 开始——设置——控制面板——管理工具——服务结束系统服务项:World Wide Web Publishing Service