基本介绍
案例
不按照依赖倒置原则的代码
//完成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"; } } class Person { public void receive(Email email ) { System.out.println(email.getInfo()); } }
方式1分析
简单,比较容易想到
如果我们获取的对象是 微信,短信等等,则新增类,同时Perons也要增加相应的接收方法
解决思路:引入一个抽象的接口IReceiver, 表示接收者, 这样Person类与接口IReceiver发生依赖
因为Email, WeiXin 等等属于接收的范围,他们各自实现IReceiver 接口就ok, 这样我们就符号依赖倒转原则`
使用依赖倒转完善上面案例
public class DependecyInversion { public static void main(String[] args) { //客户端无需改变 Person person = new Person(); person.receive(new Email()); person.receive(new WeiXin()); } } //定义接口 interface IReceiver { public String getInfo(); } class Email implements IReceiver { public String getInfo() { return "电子邮件信息: hello,world"; } } //增加微信 class WeiXin implements IReceiver { public String getInfo() { return "微信信息: hello,ok"; } } //方式2 class Person { //这里我们是对接口的依赖 public void receive(IReceiver receiver ) { System.out.println(receiver.getInfo()); } }
依赖关系传递的三种方式
上面之前的那个案例就是接口传递的方式。
下面再分别举例说明这3个方式:
以使用某电视机观看为案例
方式1:接口传递依赖
开关的接口
interface IOpenAndClose { public void open(ITV tv); //抽象方法,接收接口 }
电视接口
interface ITV { //ITV接口 public void play(); }
电视实现类–长虹电视
class ChangHong implements ITV { @Override public void play() { // TODO Auto-generated method stub System.out.println("长虹电视机,打开"); } }
使用长虹电视观看节目
class OpenAndClose implements IOpenAndClose { public void open(ITV tv) { tv.play(); } }
测试
public static void main(String[] args) { // TODO Auto-generated method stub ChangHong changHong = new ChangHong(); OpenAndClose openAndClose = new OpenAndClose(); openAndClose.open(changHong); }
方式2:通过构造方法依赖传递
测试
方式3通过setter方法传递:
测试:
完






