迪米特法则是设计模式所需要遵循的法则之一
所谓的迪米特法则:
定义如下:一个对象应该对其他对象保持最少的了解,类与类之间的关系越密切,耦合度越大,当一个类发生改变的时候。对另外一个类的影响也越大。所以应该尽量降低类与类之间的耦合度
迪米特法则又叫做最少知道原则,指的是一个类对自己依赖的类知道的越少越好,迪米特法则还有一个更加简单的定义:只和直接的朋友通信,
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等等。其中,我么称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友,也就是还说,陌生的类最好不要作为局部变量的形式出现在类的内部
所谓的迪米特法则:
定义如下:一个对象应该对其他对象保持最少的了解,类与类之间的关系越密切,耦合度越大,当一个类发生改变的时候。对另外一个类的影响也越大。所以应该尽量降低类与类之间的耦合度
迪米特法则又叫做最少知道原则,指的是一个类对自己依赖的类知道的越少越好,迪米特法则还有一个更加简单的定义:只和直接的朋友通信,
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等等。其中,我么称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友,也就是还说,陌生的类最好不要作为局部变量的形式出现在类的内部
我在网上找讲解迪米特法则的简单例子,很多用java做实例,还是这个耳熟能详的老师让体育委员计算女生数目的例子。好,那我给PHP做实例的这个写个注释吧。原文地址是http://my.oschina.net/shyl/blog/531542
下面是违反迪米特法则的代码实例:
class Teacher {
//老师对学生发布命令,清一下女生
public function commond(GroupLeader $groupLeader){
//初始化女生
for($i=0; $i<20; $i++){
$listGirls[] = new Girl();
}
//告诉体育委员开始执行清查任务
$groupLeader -> countGirls($listGirls);
}
}
class GroupLeader {
//有清查女生的工作
public function countGirls($listGirls = array()){
echo '女生的数量是:' . sizeof($listGirls);
}
}
class Girl {
}
class Client {
public static function doing() {
$teacher= new Teacher();
//老师发布命令
$teacher -> commond(new GroupLeader());
}
}
Client :: doing();
代码完美运行:下面是运行结果
我们来看优化后的代码,作者把使用Girl类的部分代码挪移到了场景客户端。
<?php
header("content-type:text/html;charset=utf8");
class Teacher {
public function commond(GroupLeader $groupLeader){
//告诉体育委员开始执行清查任务
$groupLeader -> countGirls();
}
}
class GroupLeader {
private $_listGirls = array();
//传递全班的女生
public function __construct($listGirls){
$this -> _listGirls = $listGirls;
}
//有清查女生的工作
public function countGirls(){
echo "女生数量是:" . sizeof($this -> _listGirls);
}
}
class Girl {
}
class Client {
public static function doing() {
//初始化女生
for($i=0; $i<22; $i++){
$listGirls[] = new Girl();
}
$teacher= new Teacher();
//老师发布命令
$teacher -> commond(new GroupLeader($listGirls));
}
}
Client :: doing();
?>
这样就符合迪米特法则了。