首页 > 其他分享 >依赖倒转原则详解

依赖倒转原则详解

时间:2023-08-27 22:14:14浏览次数:32  
标签:依赖 void class itv 详解 倒转 new public

依赖倒转原则

基本介绍

依赖倒转原则(Dependence Inversion Principle):

  • 1.高层模块,不要依赖底层模块,二者都应该依赖其抽象。
  • 2.抽象不应该依赖细节,细节应该依赖抽象。
  • 3.依赖倒转的核心思想是面向接口编程。
  • 4.依赖倒转原则基于这样的设计理念:相对于细节的多变,抽象的东西就稳定的多。以抽象为基础搭建的架构,比细节为基础的架构要稳定的多。在Java中,抽象是指定义好的接口或抽象类,
    细节是其具体的实现类。
  • 5.使用接口或抽象类的目的就是指定好规范,不涉及具体的操作,把具体细节的任务交给具体的实现类实现。
案例1
/**
 * @author 长名06
 * @version 1.0
 * 案例1 分析
 * Person类直接依赖Email类,违反了依赖倒转原则
 * 如果Person类对象还要查看其他的信息,就需要额外新增加方法
 * 改进,应该抽象一个信息接口,具体的信息类实现这个接口
 */
public class Inversion1 {
    public static void main(String[] args) {
        new Person().showInfo(new Email());
    }
}

class Email{
    public String getInfo(){
        return "邮箱消息: hello world!";
    }
}

class Person{
    public void showInfo(Email email){
        System.out.println(email.getInfo());
    }
}
案例2
/**
 * @author 长名06
 * @version 1.0
 * 使用依赖倒转原则改进
 */
public class Inversion2 {
    public static void main(String[] args) {
        new Person().showInfo(new Email());
        new Person().showInfo(new WerXin());
    }
}

interface Information{
    public String getInfo();
}

class Email implements Information{
    @Override
    public String getInfo() {
        return "邮箱消息: hello world!";
    }
}

class WerXin implements Information{
    @Override
    public String getInfo() {
        return "微信消息: hello world!";
    }
}

class Person{
    public void showInfo(Information information){
        System.out.println(information.getInfo());
    }
}
依赖关系的实现方式

分别是接口传递,构造方法传递,setter方式传递。

/**
 * 模拟依赖传递的三种方式
 * @author 小少年
 * @version 1.0
 */
public class DependencePass {
    public static void main(String[] args) {
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.open(new ChangHong());

        ChangHong1 changHong1 = new ChangHong1();
        OpenAndClose1 openAndClose1 = new OpenAndClose1(changHong1);
        openAndClose1.open();

        ChangHong2 changHong2 = new ChangHong2();
        OpenAndClose2 openAndClose2 = new OpenAndClose2();
        openAndClose2.setItv(changHong2);
        openAndClose2.open();
    }
}

//依赖 就是在本类中使用到另一个类的这种关系
//方式1 通过接口实现依赖传递
interface IOpenAndClose{//用于开关电视的接口
    public void open(ITV tv);//使用一个接口的对象作为方法的参数
}

interface ITV{//电视的接口
    public void play();
}

class ChangHong implements ITV{//具体的一个电视品牌
    @Override
    public void play() {
        System.out.println("长虹电视,打开");
    }
}

class OpenAndClose implements IOpenAndClose{//具体的一个开关接口
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}

//方式2 通过构造方法实现依赖传递
interface IOpenAndClose1{
    public void open();
}

interface ITV1{
    public void play();
}

class ChangHong1 implements ITV1{
    @Override
    public void play() {
        System.out.println("长虹电视1,打开");
    }
}

class OpenAndClose1 implements IOpenAndClose1{

    public ITV1 itv;

    public OpenAndClose1(ITV1 itv){
        this.itv = itv;
    }

    @Override
    public void open() {
        itv.play();
    }
}

//方式3 通过setter方法实现依赖传递
interface IOpenAndClose2{
    public void open();
}

interface ITV2{
    public void play();
}

class ChangHong2 implements ITV2{
    @Override
    public void play() {
        System.out.println("长虹电视2 打开");
    }
}

class OpenAndClose2 implements IOpenAndClose2{

    public ITV2 itv;

    public void setItv(ITV2 itv){
        this.itv = itv;
    }

    @Override
    public void open() {
        this.itv.play();
    }
}
注意事项和细节
  • 1.底层模块尽量都要由抽象类或接口,或者两者都有,程序稳定性更好。
  • 2.对象的声明类型尽量都是抽象类或接口,这样在我们的对象引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化。
  • 3.继承时,要遵守里氏替换原则(下次就写)。
    只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:依赖,void,class,itv,详解,倒转,new,public
From: https://www.cnblogs.com/changming06/p/17660939.html

相关文章

  • 最完整的 generatorConfig.xml 配置详解
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">&......
  • JVM调优工具详解及调优实战
    前置启动程序事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用 Jmap此命令可以用来查看内存信息,实例个数以及占用内存大小 jmap-histo14660#查看历史生成的实例jmap-histo:live14660#查看当前存活的实例,执行过程中可能会触发一次full......
  • 为什么@Autowired写在属性上方进行依赖注入时,可以省略setter方法?
    众所周知,spring的依赖注入方式有两种,setter方法注入和构造器注入。但是在实际开发中,即便类的属性没有setter方法,类也没有构造器,只要在属性的上方添加@Autowired注解,这个类属性依然会被自动注入,那么到底是为什么呢?经过上网查询发现,spring其实是从容器查找符合属性类型的对象,通过......
  • 5、依赖注入
    5、依赖注入5.1、构造器注入前面已经说过了5.2、set方法注入 依赖注入:set注入依赖:Bean对象的从创建依赖于容器注入:Bean所有对象的属性,由容器来注入环境搭建:publicclassStudent{privateStringname;privateAddressaddress;privateString[]......
  • Modbus协议详解1:Modbus的简介
    Modbus协议是应用非常广泛的一种通信协议规约,也是最早应用在工业现场的协议。早在1979年出现工业串行链路以来,Modbus的应用就开始普遍起来,它使得各种自动化设备之间的互相通信得到实现,做嵌入式产品开发的朋友应该不会陌生,Modbus的身影是随处可见的。并且在中国Modbus都已经形成了规......
  • linux下vim命令详解
    高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的::qx    开始记录宏,并将结果存入寄存器xq    退出记录模式@x    播放记录在x寄存器中的宏命令稍微解释一下,当在normal模式下输入:qx后,你对文本的所有编辑动作将会被记录下来,再次输入q即退......
  • 最短路三种算法详解
    最短路最短路问题即,给你一张图,让你求出图中两点的最短距离。这篇文章会讲解\(Dijkstra\)、\(Spfa\)、\(Floyd\)三种算法,让您透彻理解最短路!Dijkstra朴素版题目:\(Dijkstra\)通常是用来解决图中一个定点到其余点的最短距离,基本思路是:从中心向外扩展,直到扩展到终点为止。......
  • ChatGPT全称是什么?一文详解chatGPT含义、特点及未来发展
    一、引言近年来,人工智能(AI)技术的迅猛发展为人类生活带来了诸多变革。其中,聊天机器人(Chatbot)作为AI领域的重要应用之一,逐渐融入了我们的日常生活。而在这个领域中,ChatGPT成为了备受瞩目的明星产品。那么,ChatGPT全称是什么?它的含义又是怎样的呢?本文将详细解析ChatGPT的含义、特点以......
  • 垃圾收集器ParNew&CMS与底层三色标记算法详解
    垃圾收集算法分代收集理论当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近9......
  • 跨境电商需要用到的电商API详解(淘宝京东拼多多1688API)
    随着电子商务的快速发展,跨境电商已经成为越来越多企业的选择。在跨境电商的业务流程中,电商API发挥着至关重要的作用。本文将详细介绍跨境电商需要用到的电商API,包括商品信息、商品类目信息、店铺信息、交易明细信息、商品管理、评价信息、店铺用户信息等。一、商品信息API  获......