迪米特法则

迪米特法则

定义:一个对象应该对其他对象了解最少

迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。

迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
这里我们用到设计之禅中的一个例子,老师想知道班里面的女人数,就让体育委员去清点女生的人数。

Girl类

public class Girl {

}
Teacher类

public class Teacher {
	
	public void commond(GroupLeader groupLeader){
		List<Girl> listGirls=new ArrayList();
		
		for(int i=0;i<20;i++)
			listGirls.add(new Girl());
		
		groupLeader.countGirls(listGirls);
		
	}

}
GroupLeader类
public class GroupLeader {
	
	public void countGirls(List<Girl> listGirls){
		System.out.println("女生数量是:"+listGirls.size());
	}

}
测试实例
public class testdemo {
	
	public static void main(String arg[]){
		
		Teacher teacher=new Teacher();
		teacher.commond(new GroupLeader());
		
	}

}
结果
女生数量是:20
这里就有一个严重的问题在Teacher类中,按照道理说老师只需要发布一个命令给体育委员,其他的工作都应该体育委员来实现工作,但是这个例子中老师负责的东西太多,对于程序的扩张性很不好。一个相对较好的方法就是,老师发布命令给体育委员让其查女生数量,然后体育委员去遍历女生的个数。

同样的Girl类

public class Girl {

}
Teacher类
public class Teacher {
	
	public void commond(GroupLeader groupLeader){
		
		groupLeader.countGirls();
		
	}

}
GroupLeader类

public class GroupLeader {
	
	private List<Girl> listGirls;
	
	public GroupLeader(List<Girl> listGirls){
		this.listGirls=listGirls;
	}
	
	public void countGirls(){
		System.out.println("女生数量是:"+this.listGirls.size());
	}

}
测试实例

public class testdemo {
	
	public static void main(String arg[]){
		
		List<Girl> listGirls=new ArrayList<Girl>();
		
		for(int i=0;i<20;++i)
			listGirls.add(new Girl());
		
		Teacher teacher =new Teacher();
		teacher.commond(new GroupLeader(listGirls));
		
	}

}
结果
女生数量是:20
这样老师就不需要知道班级女生的情况,他只需要知道体育委员就可以,给体育委员一个命令,体育委员根据老师的命令然后去接触女生这个群体计算结果。而女生群体在测试的时候再实现,这样是程序更加简洁稳健。
关于应用迪米特法则的注意事项:

① 在类的划分上,应该创建有弱耦合的类;
② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
③ 在类的设计上,只要有可能,一个类应当设计成不变类;
④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
⑤ 尽量降低类的访问权限;
⑥ 谨慎使用序列化功能;
⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。

       在实际应用中经常出现这样一个方法,放在本类中也可以,放在其他类中也没错,那怎么去衡量呢?你可以坚持这样一个原则:如果一个方法放在本类中,即不增加类间关系,也不对本类产生负面影响,就放置在本类中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值