设计模式-六大设计原则(三)

接口隔离原则

依赖倒置原则要求我们需要使用接口来对高层和低层进行解耦,但是接口并不是想用就能用的,它的使用还要遵从接口隔离原则,它的定义为:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上

举个例子

对于A类,他需要接口X的method1(),method2(),method3();对于B类,它需要接口X的method4(),method5(),代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public interface X {
void method1();
void method2();
void method3();
void method4();
void method5();
}

public class A implements X {

@Override
public void method1() {

}

@Override
public void method2() {

}

@Override
public void method3() {

}

@Override
public void method4() {

}

@Override
public void method5() {

}
}

public class B implements X {
@Override
public void method1() {

}

@Override
public void method2() {

}

@Override
public void method3() {

}

@Override
public void method4() {

}

@Override
public void method5() {

}
}

然而A并不需要method4()和method5();B并不需要method1(),method2(),method3();根据接口隔离原则,这种写法并不正确,应该把X接口划分为两个,如下:

1
2
3
4
5
6
7
8
9
10
public interface X {
void method1();
void method2();
void method3();
}

public interface Y {
void method4();
void method5();
}

然后A,B分别实现X,Y接口.

迪米特原则

类与类之间的关系越密切,耦合度越大,当一个类发生改变,对另外一个类的影响也会很大.所以需要迪米特原则(最少知道原则)来规范,它的定义为:一个对象应该对其他对象保持最少的了解

举个例子

一个集团公司,下属单位有分公司和直属部门,现在需要打印所有下属单位的员工ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//主公司员工
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();
SubEmployee emp = new SubEmployee();
emp.setId("1号员工");
//....许多员工省略掉
return list;
}
}
//
class CompanyManager(){
public List getAllEmployee(){
List list = new ArrayList();
Employee emp = new Employee();
emp.setId("1号员工");
//....许多员工省略掉
return list;
}

public void printAllEmployee(SubCompanyManager scm){
System.out.println(this.getAllEmployee());//打印本类中得到的list
System.out.println(scm.getAllEmployee());//打印其他类中得到的list
}

}
//劣势显而易见CompanyManager类如果需要打印所有员工,就需要导入SubCompanyManager
//然后在CompanyManager中去打印scm的数据

修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class SubCompanyManager(){
public List getAllEmployee(){
List list = new ArrayList();
SubEmployee emp = new SubEmployee();
emp.setId("1号员工");
//....许多员工省略掉
return list;
}
public void printEmployee(){
System.out.println(this.getAllEmployee());//打印本类中得到的list
}
}

class CompanyManager(){
public List getAllEmployee(){
List list = new ArrayList();
Employee emp = new Employee();
emp.setId("1号员工");
//....许多员工省略掉
return list;
}

public void printAllEmployee(SubCompanyManager scm){
System.out.println(this.getAllEmployee());//打印本类中得到的list
scm.printEmployee();//调用scm的printEmployee()方法去打印,降低了耦合度
//scm管理它自己的打印方法.CompanyManager仅仅调用该方法.
}

}