迪米特法则(Law of Demeter) 简介

在Java里class设计经常会提到一些个原则或者规则


最出名的莫非是 封闭-开放原则了(closed-open principle)

而这次这个 Law of Demeter 也是挺重要的.


一, 迪米特法则(Law of Demeter)的定义

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.



解释:

通常只看定义是不能理解的...


我们可以把这个法则分拆性两点.


1. 类设计中, 尽量降低成员的访问权限(最低是Private)

2. 类A 假如 不认识 类B, 那么类B不能直接访问类A的方法.


3. 假如类B要访问类A,  那么类B可以借组 第三个类C来实现,  ( 类C是类A认识的类).





二,一个例子

例如我们可以找联通客服mm来查询手机月费信息.


但是我们不能直接找联通的客服人员, 因为我们没有联通客服的私人号码.


这样则说明, 联通客服人员的服务方法不是Public的, 一般人不能直接访问.


SupportMM: 位于service包内

package lawOfDemeter.service;

import lawOfDemeter.Customer;

public class SupportMM {
	private String name;
	protected SupportMM(String name){
		this.name = name;
	}
	protected void service(Customer c){
		System.out.println("Hello i am " + this.name);
	}
}


可见她的构造函数和service方法都是包内访问的.


CustomerService: 位于service包内

这个是客服类.

客服类与客服MM类处于同1个包内,

客服类有个查找空闲mm的方法, 并且让空闲的mm去接客.


但是客服的service方法是对外的(public)

也就说所有客户都可以直接访问客服.


package lawOfDemeter.service;

import lawOfDemeter.Customer;

public class CustomerService {
	public static void service(Customer c){
		getFreeSupport().service(c);
	}
	
	private static SupportMM getFreeSupport(){
		return new SupportMM("Inne"); // just a sample
	}
}



Customer: 位于service包外

由于在包外, 所以Customer是不能直接访问SupportMM的


package lawOfDemeter;

import lawOfDemeter.service.*;
public class Customer {
	public void askHelp(){
		CustomerService.service(this);
	}
}

但是它可以通过客服来间接获得supportMM的服务.


UML:








三,小结

上面的那个例子是符合law of demeter的

它有什么优点呢.


就是当我们修改supportMM的内容时,  customer并不会受到任何影响.


也就是 松耦合的好处.


其实所有设计模式的目的无非两点:


1. 另业务思路更加清晰

2. 便于修改和扩展
















  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值