移动架构27_设计模式六大原则五: 迪米特法则
来源:互联网 发布:白金数据txt 编辑:程序博客网 时间:2024/06/05 12:42
设计模式六大原则:
- 单一原则
- 里氏替换原则
- 接口隔离原则
- 依赖倒置原则
- 迪米特法则
- 开闭原则
1、定义:
最少知识原则, 一个对象应该对其它对象有最少的了解, 即一个类对自己需要耦合或者调用的类知道的最少;
问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
解决方案:尽量降低类与类之间的耦合。
2、原则:
保持距离方法 : 将 类 B 暴露给 A 的方法封装, 暴露的方法越少越好, 类 B 高内聚, 与 A 低耦合;
设计方法 : 一个类的 public 方法越多, 修改时涉及的范围也就越大, 变更引起的风险也就越大, 在系统设计时要注意, 能用 private 就用private , 能用 protected 就用 protected, 能少用 public 就少用 public, 能加上 final 就加上 final;
3、优缺点:
优点 类间解耦, 弱耦合, 耦合降低, 复用率提高;
缺点 类间的耦合性太低, 会产生大量的中转或跳转类, 会导致系统的复杂性提高, 加大维护难度;
4、Demo
举一个例子:有一个集团公司,下属单位有分公司和直属部门,现在要求打印出所有下属单位的员工ID。先来看一下违反迪米特法则的设计。
//总公司员工
class Employee{
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}
//分公司员工
class SubEmployee{
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}
class SubCompanyManager{
public List getAllEmployee(){
List list = new ArrayList();
for(int i=0; i<100; i++){
SubEmployee emp = new SubEmployee();
//为分公司人员按顺序分配一个ID
emp.setId(“分公司”+i);
list.add(emp);
}
return list;
}
}
class CompanyManager{
public List getAllEmployee(){
List list = new ArrayList();
for(int i=0; i<30; i++){
Employee emp = new Employee();
//为总公司人员按顺序分配一个ID
emp.setId(“总公司”+i);
list.add(emp);
}
return list;
}
public void printAllEmployee(SubCompanyManager sub){
List list1 = sub.getAllEmployee();
for(SubEmployee e:list1){
System.out.println(e.getId());
}
List<Employee> list2 = this.getAllEmployee();for(Employee e:list2){ System.out.println(e.getId());}}
}
public class Client{
public static void main(String[] args){
CompanyManager e = new CompanyManager();
e.printAllEmployee(new SubCompanyManager());
}
}
现在这个设计的主要问题出在CompanyManager中,根据迪米特法则,只与直接的朋友发生通信,而SubEmployee类并不是CompanyManager类的直接朋友(以局部变量出现的耦合不属于直接朋友),从逻辑上讲总公司只与他的分公司耦合就行了,与分公司的员工并没有任何联系,这样设计显然是增加了不必要的耦合。按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合。修改后的代码如下:
class SubCompanyManager{
public List getAllEmployee(){
List list = new ArrayList();
for(int i=0; i<100; i++){
SubEmployee emp = new SubEmployee();
//为分公司人员按顺序分配一个ID
emp.setId(“分公司”+i);
list.add(emp);
}
return list;
}
public void printEmployee(){
List list = this.getAllEmployee();
for(SubEmployee e:list){
System.out.println(e.getId());
}
}
}
class CompanyManager{
public List getAllEmployee(){
List list = new ArrayList();
for(int i=0; i<30; i++){
Employee emp = new Employee();
//为总公司人员按顺序分配一个ID
emp.setId(“总公司”+i);
list.add(emp);
}
return list;
}
public void printAllEmployee(SubCompanyManager sub){
sub.printEmployee();
List list2 = this.getAllEmployee();
for(Employee e:list2){
System.out.println(e.getId());
}
}
}
修改后,为分公司增加了打印人员ID的方法,总公司直接调用来打印,从而避免了与分公司的员工发生耦合。
迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系,例如本例中,总公司就是通过分公司这个“中介”来与分公司的员工发生联系的。过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合。
- 移动架构27_设计模式六大原则五: 迪米特法则
- 设计模式六大原则之五:迪米特法则
- 设计模式六大原则:迪米特法则
- 设计模式六大原则:迪米特法则
- 设计模式六大原则--迪米特法则
- 设计模式六大原则----------迪米特法则
- 《设计模式》六大原则之一:迪米特法则
- 设计模式六大原则之迪米特法则
- 移动架构23_设计模式六大原则一:单一职责原则
- 移动架构24_设计模式六大原则二:里氏替换原则
- 移动架构25_设计模式六大原则三:接口隔离原则
- 移动架构26_设计模式六大原则四:依赖倒置原则
- 移动架构28_设计模式六大原则六: 开闭原则
- 设计模式笔记(五)设计六大原则之五--迪米特法则
- 设计模式六大原则(五)迪米特法则(最少知道原则)
- 设计模式六大原则(五)-- 最少知识原则 ( LKP ) / 迪米特法则 ( LOD )
- 设计模式学习之——六大设计原则之五:迪米特法则
- 设计模式学习之——六大设计原则之五:迪米特法则
- 20171021《css3专业网页开发指南》
- Abstract class 与 Interface 区别
- 2个鸡蛋100层楼--动态规划
- 怎么在Linux虚拟机中快速配置jdk
- 进程间通信——管道
- 移动架构27_设计模式六大原则五: 迪米特法则
- C/C++:多线程下使用dlopen、dlsym、dlclose装载动态库
- Linux常用命令
- Jzoj4731 游戏(待填)
- 【JAVA_SE】作业练习1021
- [笔记]有上下界的网络流笔记
- 贪心法 部分背包问题 结构体数组 FatMouse' Trade
- Set接口源码解析
- 深入理解Activity进阶系列(一):Activity启动