文章目录

基本介绍

设计模式(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";
}
}

class Person {
public void receive(Email email ) {
System.out.println(email.getInfo());
}
}

方式1分析

  1. 简单,比较容易想到
  2. ​如果我们获取的对象是 微信,短信等等,则新增类,同时Perons也要增加相应的接收方法​
  3. 解决思路:​​引入一个抽象的接口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) --依赖倒转原则_微信_02


上面之前的那个案例就是接口传递的方式。

下面再分别举例说明这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);
}

设计模式(3) --依赖倒转原则_设计模式_03

方式2:通过构造方法依赖传递

设计模式(3) --依赖倒转原则_设计模式_04


测试

设计模式(3) --依赖倒转原则_构造方法_05

方式3通过setter方法传递:

设计模式(3) --依赖倒转原则_设计模式_06


测试:

设计模式(3) --依赖倒转原则_微信_07