【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

相关文章
|
7天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
3天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
7天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
7天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
3天前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
在Java 8中引入的Lambda表达式是一种强大的编程工具,它可以显著简化代码,提高可读性。本文将介绍Lambda表达式的基本概念、优势以及在实际开发中的应用。通过具体示例,您将了解如何使用Lambda表达式来简化集合操作、线程编程和函数式编程。让我们一起探索这一革命性的特性,看看它是如何改变Java编程方式的。
16 4
|
3天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码
【8月更文挑战第49天】在Java 8的发布中,Lambda表达式无疑是最令人兴奋的新特性之一。它不仅为Java开发者提供了一种更加简洁、灵活的编程方式,而且还极大地提高了代码的可读性和开发效率。本文将通过实际代码示例,展示如何利用Lambda表达式优化和重构Java代码,让你的编程之旅更加轻松愉快。
|
8天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
28 6
|
5天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提高代码的可维护性与扩展性
在本文中,我们将深入探讨PHP编程语言中设计模式的重要性,以及如何通过应用这些模式来提高代码的可维护性和扩展性。设计模式是一套被反复使用、经过分类编目的代码设计经验的总结。它们代表了最佳的实践,能帮助开发者编写出更加健壮、灵活和可复用的代码。本文将介绍几种常见的设计模式,并通过PHP代码示例展示其应用。
|
14天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
41 11
|
6天前
|
Java 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第14天】本文旨在揭示Java 8中引入的Lambda表达式如何革新了我们编写和管理代码的方式。通过简洁明了的语言和直观的代码示例,我们将一起走进Lambda表达式的世界,了解其基本概念、语法结构以及在实际编程中的应用。文章不仅会展示Lambda表达式的魅力所在,还会指导读者如何在日常工作中有效利用这一特性,以提高编码效率和程序可读性。