第2章 面向对象的设计原则(SOLID):5_迪米特法则
2016-05-10 16:11
218 查看
5. 迪米特法则(Law of Demeter,LoD)
5.1 定义
(1)应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,即对其他依赖的类越少越好(不要和太多的类发生关系)。
(2)尽量不要让类和类之间建立直接的关系,这样可减少类与类之间的依赖,降低类之间的耦合。
(3)一个类应对自己需要耦合的类知道得最少,只知道其public方法,其内部如何复杂自己没有关系,也叫最少知识原则(Least Knowledge Principle,LKP)。
5.2 迪米特法则:核心要义就是类间解耦、低耦合
(1)只和直接朋友交流
①直接朋友的定义:出现在成员变量、方法的输入参数和返回值的类称为朋友类
②非朋友:出现在方法体内部的类
【编程实验】体育委员点名
//违反LoD的设计
//遵循LoD法则的设计
(2)朋友间也是有距离的
//知道得太多:InstallSoftware类和Wizard的耦合太紧
//松耦合:隐藏Wizard类安装步骤的接口,降低耦合度
(3)是自己的就是自己的
当某个方法放在本类可以,放在其他类也没错,那么根据迪米特法则,可以在不增加类间的关系,也不对本类产生负面影响,就放置在本类中。
5.3 最佳实践
(1)迪米特法则的核心观念就是类间解耦、弱耦合
(2)解耦是有限度的,在实际的项目中,需要适度考虑这个原则。
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 = 0; i< 20; i++) { Girl g; listGirls.push_back(g);//会复制一份过去 } groupLeader.countGirls(listGirls); } }; int main() { Teacher teacher; GroupLeader groupLeader; //老师发布命令 teacher.command(groupLeader); return 0; }
//遵循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 = 0; i< 20; i++) { Girl g; listGirls.push_back(g);//会复制一份过去 } // GroupLeader groupLeader(listGirls); //老师发布命令 teacher.command(groupLeader); return 0; }
(2)朋友间也是有距离的
//知道得太多:InstallSoftware类和Wizard的耦合太紧
//松耦合:隐藏Wizard类安装步骤的接口,降低耦合度
(3)是自己的就是自己的
当某个方法放在本类可以,放在其他类也没错,那么根据迪米特法则,可以在不增加类间的关系,也不对本类产生负面影响,就放置在本类中。
5.3 最佳实践
(1)迪米特法则的核心观念就是类间解耦、弱耦合
(2)解耦是有限度的,在实际的项目中,需要适度考虑这个原则。
相关文章推荐
- 去掉scrollview顶部的灰条
- Maven构建springMVC+mybites
- jquery select全部遍历
- 友元类
- 【笔记】 《js权威指南》- 第19章 JQuery类库 - 19.1 JQuery基础
- Java里面的arraycopy总结
- 关于mybatis批量插入和传统的jdbc操作的比较
- MyBatis-spring和spring JDBC批量插入Mysql的效率比较
- A - Ace of Aces——ZOJ
- NGUI中不规则形状点击事件
- JS原型和原型链
- paper 68 :MATLAB中取整函数(fix, floor, ceil, round)的使用
- 浅析extern关键字
- 走进谷歌Tilt Brush带来的艺术世界
- matlab学习笔记-保存图片
- 编码格式(关于utf-8,gb2312,gbk,big5等)
- android之从第三方启动自己的apk
- 在Ubuntu Server 32bit搭建hustoj -- 上
- CSAcademy Beta Round #5 Force Graph
- 大搬家--百度之星 (递推)