【Java设计模式】今天终于弄懂了依赖倒转原则和依赖关系传递的三种方式(代码详解)

简介: 【Java设计模式】今天终于弄懂了依赖倒转原则和依赖关系传递的三种方式(代码详解)

一、依赖倒转原则

基本原则

高层模块不应该依赖底层模块,二者都应该依赖其抽象

抽象不应该依赖细节,细节应该依赖抽象

依赖倒转的中心思想是面向接口编程

设计理念

相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类

使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

代码对比

代码一:


public class A {
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
    }
}
class Email{
    public String getInfo(){
        return "电子邮箱:我是一棵卷心菜";
    }
}
class Person {
    public void receive(Email email){
        System.out.println(email.getInfo());
    }
}



代码一比较简单,容易想到。但是如果我们获取的对象是其它的,比如QQ,就需要在Person类中增加相应的接收方法,接下来看看代码二是如何解决这样的问题


代码二:


public class B {
    public static void main(String[] args) {
        Man man = new Man();
        man.receive(new QQ());
    }
}
interface Receiver{
    String info();
}
class QQ implements Receiver{
    public String info() {
        return "用QQ接收信息";
    }
}
class WeChat implements Receiver{
    public String info() {
        return "用WeChat接收信息";
    }
}
class Man{
    public void receive(Receiver receiver){
        System.out.println(receiver.info());
    }
}



代码二引入一个抽象的接口Receiver,这样Man类与接口发生了依赖


二、依赖关系传递

方式一:接口传递

代码实现:

public class C {
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
  OpenAndClose openAndClose = new OpenAndClose();
  openAndClose.open(changHong);
    }
}
 //开关的接口
 interface IOpenAndClose {
 void open(ITV tv); //抽象方法,接收接口
 }
 //ITV接口
 interface ITV { 
 void play();
 }
 class ChangHong implements ITV {
  @Override
  public void play() {
  System.out.println("打开长虹电视机");
  }
 }
// 实现接口
 class OpenAndClose implements IOpenAndClose{
 public void open(ITV tv){
 tv.play();
  }
 }



可以看到,接口IOpenAndClose 的方法中,引用了接口ITV ,实现了接口的传递,简化了代码


方式二:构造方法传递

代码实现

public class C {
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose(changHong);
        openAndClose.open();
    }
}
class ChangHong implements ITV {
    @Override
    public void play() {
        System.out.println("打开长虹电视机");
    }
}
interface IOpenAndClose {
    void open(); //抽象方法
}
interface ITV { //ITV接口
    void play();
}
class OpenAndClose implements IOpenAndClose {
    public ITV tv;
    public OpenAndClose(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}


通过创建OpenAndClose 的对象时,把changHong 这个对象放在构造器中,同时呢,ChangHong类又实现了ITV 接口,通过构造器的方法实现关系传递,非常的巧妙


方式三:setter方式传递

代码实现:

public class C {
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.setTv(changHong);
        openAndClose.open();
    }
}
interface IOpenAndClose {
    void open(); 
    void setTv(ITV tv);
}
interface ITV {
    void play();
}
class OpenAndClose implements IOpenAndClose {
    private ITV tv;
    public void setTv(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}
class ChangHong implements ITV {
    public void play() {
        System.out.println("打开长虹电视机");
    }
}


代码三比较好理解,接口IOpenAndClose 中写一个方法void setTv(ITV tv),就把接口ITV放进去了,也达到了依赖关系的传递


以上代码的运行结果都是一样的:

image.png

相关文章
|
5月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
453 6
|
5月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
316 115
|
5月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
231 98
|
5月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
458 43
|
5月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
464 94
|
5月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
6月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
793 3
|
设计模式 缓存 Java
Java新人常问:什么是依赖倒置原则?万字案例给你讲懂!(下)
Dependence Inversion Principle,DIP High level modules should not depend upon low level modules.Both should depend upon abstractions.高层模块不应该依赖低层模块,二者都应该依赖其抽象 Abstractions should not depend upon details.Details should depend upon abstractions.抽象不应该依赖细节;细节应该依赖抽象 针对接口编程,不要针对实现编程。
479 0
Java新人常问:什么是依赖倒置原则?万字案例给你讲懂!(下)
|
消息中间件 Java 中间件
Java新人常问:什么是依赖倒置原则?万字案例给你讲懂!(上)
Dependence Inversion Principle,DIP High level modules should not depend upon low level modules.Both should depend upon abstractions.高层模块不应该依赖低层模块,二者都应该依赖其抽象 Abstractions should not depend upon details.Details should depend upon abstractions.抽象不应该依赖细节;细节应该依赖抽象 针对接口编程,不要针对实现编程。
566 0
Java新人常问:什么是依赖倒置原则?万字案例给你讲懂!(上)
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
276 1