设计模式——依赖倒转原则

基本介绍

依赖倒转原则是指

  1. 高层模块不应该依赖底层模块,二者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转(倒置)的中心思想是面向接口编程
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多,在Java中,抽象指的是接口或抽象类,细节就是具体的实现类
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

案例

dart 复制代码
package com.baidu.principle.inversion;
public class DependencyInversion {
    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());
    }
}

改进

dart 复制代码
package com.baidu.principle.inversion.improve;
public class DependencyInversion {
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
        person.receive(new WeChat());
    }
}
interface IReceiver{
    public String getInfo();
}
class Email implements IReceiver{
    public String getInfo(){
        return "电子邮件信息:hello world";
    }
}
class WeChat implements IReceiver{

    @Override
    public String getInfo() {
        return "微信信息:你好";
    }
}

class Person{

    public void receive(IReceiver receiver){
        System.out.println(receiver.getInfo());
    }
}

依赖关系传递的三种方式和应用案例

接口传递

构造方法传递

setter方式传递

dart 复制代码
package com.baidu.principle.inversion.improve.test;
public class Test {
    public static void main(String[] args) {

    }
}

interface IOpenAndClose{
//     抽象方法
    public void open();

    public void setTv(ITV tv);

}

interface ITV{
    public void play();
}

class OpenAndClose implements IOpenAndClose{
    private ITV tv;
    public void setTv(ITV tv){
        this.tv = tv;
    }

    public void open(){
        this.tv.play();
    }

}

依赖倒转原则的注意事项和细节

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
  2. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
  3. 继承时遵循里氏替换原则
相关推荐
YatHinLay5 小时前
Spring Boot + Calcite 实现跨库查询
java
酷炫码神5 小时前
MosMos 创意效果与能力边界展示
java
Wang's Blog5 小时前
Java 接入Redis: 使用Jedis操作Redis
java·服务器·redis
事圆则缓5 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
shehuiyuelaiyuehao5 小时前
算法50,分治归并,数组中的逆序对
java·算法
烽学长5 小时前
(附源码)基于Springboot+vue的图书阅读分享系统的设计与实现
java·spring boot·后端
Ivanqhz5 小时前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习
青山木6 小时前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq
MayBaymax6 小时前
Spring AI Alibaba Graph 实战:客服工单智能处理
java·ai·ai编程
光依旧6 小时前
MCP实战手记系列(五):让工具返回一个能点的界面(文末附github源码链接)
java·spring ai·前端集成·mcp·mcp apps