1.介绍:
1.1依赖倒转原则:(DIP)
定义一:高层模块不应依赖底层模块,二者都应依赖抽象;细节依赖抽象
定义二:要针对接口编程,不要针对实现编程
比如孕妇与龙凤胎,有孕妇,才能生龙凤胎,孕妇是抽象,龙凤胎(包括男婴,女婴)是实现。
1.2 为什么要实现依赖倒转
1.实现代码重用:比如切换数据库,无须重构代码
2.作用:比如居民家中使用电视盒,以插口的方式进行网络链接,如果机房网络的连接发生变化,只需要在机房中进行变换,电视盒仍用原插口;
如果我们不使用插口来连接电视盒,直接与机房网络进行连接,则在网络方式发生变化事,需要重新改造线路。
接口大大提高了系统的扩展性与灵活性。
1.3如何实现依赖倒转
1.从实现类与抽象类的角度进行分析,我们在运用具体实现类与实现抽象类时,需要保证引用“基类”之处可以修改成其子类;
2.从层次关系角度进行分析,需要定义清晰的层次关系,使每个层次通过接口的方式进行;
3.从对象构造角度进行分析,如果创建的是动态的对象,则使用依赖倒转,如果创建的是一些静态的具体类并且变化率很低,则无须创建基类去继承,以规避维护多余
代码的风险。
1.题目:
公司人员包括管理层和业务员,因业务需要招聘两名程序员,请根据倒转依赖原则对公司人员管理进行设计,创建类图和代码
分析:
定义管理层接口,编码接口,编码类,高级程序员类,普通程序员类
类图
2.具体实现:
2.1 管理层接口
package test3;
/**
* 管理层接口
*/
public interface IEmployee {
public String code(ICode code);
}
2.2 编码接口
package test3;
/**
* 编码接口
*/
public interface ICode {
public String getRun(String Run);
}
2.3 编码类
package test3;
/**
* 编码类
*/
public class Code implements IEmployee{//程序员编码
private static final String Run = "编码活动";
@Override
public String code(ICode iCode) {
System.out.println(iCode+"程序员开始编码-----这是Code类");
return iCode.getRun(Run);
}
}
2.4 高级程序员类
package test3;
/**
* 高级程序员类
*/
public class SeniorProgrammer implements ICode {
private static final String Run ="李四";
@Override
public String getRun(String Run1) {
String Run2="高级的工作";
System.out.println(Run+"高级程序员开始工作。----这是SeniorProgrammer类。。");
return Run2;
}
}
2.5 普通程序员类
package test3;
/**
* 普通程序员类
*/
public class CommonProgrammer implements ICode {
private static final String Run = "张三";
@Override
public String getRun(String Run1) {
String Run2 ="工作";
System.out.println(Run+"普通程序员开始工作...-----这是CommonProgrammer类");
return Run2;
}
}
2.6 测试类
package test3;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
IEmployee employee = new Code();
ICode iCode = new SeniorProgrammer();
//高级程序员张三开始编程
System.out.println("----employee.code(code):"+employee.code(iCode));
ICode iCode1 = new CommonProgrammer();
//普通程序员李四开始编程
System.out.println("管理人员张三派高级程序员李四"+employee.code(iCode1));
}
}