设计模式七大原则之依赖倒转原则
一. 什么是依赖倒转原则
依赖倒转原则
:面向接口编程
1.1 特点
- 抽象不应该依赖细节,细节应该依赖抽象。
- 使用抽象的目的是制定好规范,而不涉及具体的操作,把展现细节的任务交给他们的细节去完成。
注意
:在Java中,抽象就是接口或者抽象类, 细节就是具体的实现类。所以简单来说依赖倒置就是提倡面向接口编程。
1.2 依赖关系传递的三种方式
接口传递
:在普通方法中使用接口或抽象类作为形参。构造方法传递
: 通过构造方法对本类的抽象类或者接口进行赋值。setter方式传递
: 通过setter方法对本类的抽象类或者接口进行赋值。
1.3 依赖倒转原则注意事项和细节
- 变量的声明类型尽量是抽象类或者接口,这样我们的变量引用和实际对象间,就存在一个
缓冲层
,利于程序的扩展和优化
二. 未遵循依赖倒转原则案例说明
2.1 类图设计
2.2 代码示例
package com.principle.dependency;
/**
* @author inconspicuousy
*/
public class DependencyInverse {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email()); // 我是邮件信息
}
}
class Email {
// 邮件类提供获取邮件信息的方法
public void getInfo() {
System.out.println("我是邮件信息");
}
}
class Person {
// 用户可以接收邮件, 获取到邮件信息
public void receive(Email email) {
email.getInfo();
}
}
2.3 潜在隐患
- 当前
Person
类只能接收Email
信息, 当想要扩展其他功能,比如接收短信息时就需要修改Person类,添加接收短信息的新方法。当前问题就是Person类依赖的太过细节,要修改成面向抽象来开发,这样就很好的扩展功能。
三. 完整案例
3.1 类图设计
3.2 代码示例
package com.principle.dependency;
/**
* @author inconspicuousy
*/
public class DependencyInverse {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email()); // 我是邮件信息
person.receive(new Message()); // 我是短消息
}
}
// 定义可以发送消息的抽象接口
interface ISend {
void getInfo();
}
class Email implements ISend{
// 邮件类提供获取邮件信息的方法
public void getInfo() {
System.out.println("我是邮件信息");
}
}
class Message implements ISend {
@Override
public void getInfo() {
System.out.println("我是短消息");
}
}
class Person {
// 用户可以接收任意可以发送消息的类
public void receive(ISend iSend) {
iSend.getInfo();
}
}
这里在设计Person
类时, 使其依赖接口,每当想要接收其他数据时,只需要创建可以发送消息的类去实现ISend
接口就可以作为实参传入给Person类的receive函数,使其获取到消息实体。
转载自:https://blog.csdn.net/qq844579582/article/details/109027569