依赖倒转原则(Dependence Inversion Principle)是指:
注意事项:
1)低层模块尽量都要有抽象类或接口,或者两者都有,这样程序稳定性更好。
2)变量的声明类型尽量是抽象类或接口,这样变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化。
3)继承时应遵循里氏替换原则
实现person接收消息
public class DependecyInversion { public static void main(String[] args) { Person person = new Person(); person.receive(new Email()); } } class Email{ public String getInfo() { return "电子邮件信息: hello world "; } } /* Person 类 接受消息,将Email类 作为参数 产生了依赖 * 如果 参数发生变化,即接受的是微信 或短信 整个方法需要改动 */ class Person{ public void receive(Email email) { System.out.println(email.getInfo()); } }
public class DependecyInversion { public static void main(String[] args) { Person person = new Person(); person.receive(new Email()); person.receive(new WeiXin());} } class Email{ public String getInfo() { return "电子邮件信息: hello world "; } } class WeiXin {//新增 public String getInfo() { return "微信信息: hello WeiXin "; } } class Person{ public void receive(Email email) { System.out.println(email.getInfo()); } public void receive(WeiXin weixin) {//新增 System.out.println(weixin.getInfo()); } }
分析
1.简单,比较容易想到
2.如果获取的对象是微信,短信等,则新增类,同时Perons也要增加相应的接收方法
解决:
引入一个抽象的接口IReceiver,表示接收的消息,这样Person类与接口IReceiver发生依赖因为Emai1, WeiXin等属于接收的范围,它们各自实现IReceiver接口,这样就符合依赖倒转原则。
/*定义接受的接口 */ interface IReciver{ public String getInfo(); } class Email implements IReciver{ public String getInfo() { return "电子邮件信息: hello world "; } } class WeiXin implements IReciver{ public String getInfo() { return "微信信息: hello WenXin "; } } /* Person 类 接受消息 将IReciver 接口 作为参数 产生了依赖 */ class Person{ public void receive(IReciver reciver) { System.out.println(reciver.getInfo()); } } public class DependecyInversion { public static void main(String[] args) { Person person = new Person(); person.receive(new Email()); //传入不同实现类 实现不同的接受 person.receive(new WeiXin()); } }