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

基本介绍

依赖倒转原则是指

  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. 继承时遵循里氏替换原则
相关推荐
章鱼丸-4 分钟前
DAY31 文件的拆分和写法
开发语言·python
左左右右左右摇晃10 分钟前
Java并发——synchronized锁
java·开发语言
☆56613 分钟前
C++中的命令模式
开发语言·c++·算法
wenlonglanying18 分钟前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
CQU_JIAKE34 分钟前
3.21【A】
开发语言·php
今儿敲了吗1 小时前
python基础学习笔记第九章——模块、包
开发语言·python
xyq20241 小时前
TypeScript 命名空间
开发语言
2301_810160951 小时前
C++与物联网开发
开发语言·c++·算法
sxlishaobin1 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
cm6543201 小时前
基于C++的操作系统开发
开发语言·c++·算法