设计模式(3) --依赖倒转原则
原创
©著作权归作者所有:来自51CTO博客作者怒放de每一天的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
基本介绍
案例
不按照依赖倒置原则的代码
//完成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方法传递:
测试:
完