略
接口隔离原则
依赖倒置原则要求我们需要使用接口来对高层和低层进行解耦,但是接口并不是想用就能用的,它的使用还要遵从接口隔离原则,它的定义为:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
举个例子
对于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()); System.out.println(scm.getAllEmployee()); }
}
|
修改:
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()); } }
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()); scm.printEmployee(); }
}
|