设计模式——依赖倒置(倒转)原则

基本介绍

依赖倒置原则是指:

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

实例分析

模拟信息发送

class Email {
    public String getInfo() {
        return "电子邮件信息";
    }
}

class Person {
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}

public static void main(String[] args) {
    Person person = new Person();
    person.receive(new Email());
}

分析:如果获取信息的对象是微信,短信等等,则需要增加类,同时Person也要增加相应的接收方法。如下所示:

class Email {
    public String getInfo() {
        return "电子邮件信息";
    }
}
class WeiXin {
    public String getInfo() {
        return "微信件信息";
    }
}

class Person {
    public void receiveByEmail(Email email) {
        System.out.println(email.getInfo());
    }
    public void receiveByWeiXin(WeiXin weiXin) {
        System.out.println(weiXin.getInfo());
    }
}

public static void main(String[] args) {
    Person person = new Person();
    person.receiveByEmail(new Email());
    person.receiveByWeiXin(new WeiXin());
}

很显然,这样做很麻烦。可以做如下修改:

引入一个抽象的接口IReceiver,表示接收者,这样Person类与接口IReceiver发生依赖。因为Email, WeiXin等属于接收的范围,它们各自实现IReceiver接口便符合依赖倒置的原则。修改如下所示:

public interface IReceiver {
    public String getInfo();
}

class Email implements IReceiver {

    @Override
    public String getInfo() {
        return "电子邮件接收信息";
    }
}

class WeiXin implements IReceiver {

    @Override
    public String getInfo() {
        return "微信接收信息";
    }
}

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

public static void main(String[] args) {
    Person person = new Person();
    person.receiver(new Email());
    person.receiver(new WeiXin());
}

这样做,即便增加新的方式,也只需要新增类去实现IReceiver接口即可,不必修改过多的代码。

总结

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性好。
  2. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化。
  3. 继承时遵循里氏替换原则。

补充

依赖传递的三种方式

接口传递

interface IOpenAndClose {
    public void open(ITV tv);
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {

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

构造方法传递

interface IOpenAndClose {
    public void open();
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {
    public ITV tv;
    public OpenAndClose(ITV tv) {
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

setter方式传递

interface IOpenAndClose {
    public void open();
    public void setTv(ITV tv);
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {
    public ITV tv;
    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
依赖倒置(Dependency Inversion)和控制反转(Inversion of Control)都是软件设计模式的重要概念。 依赖倒置(Dependency Inversion)是指高模块不应该依赖于低模块,而是应该依赖抽象接口。这意味着在设计时,我们应该通过接口或抽象类来定义模块之间的依赖关系,而不是直接依赖于具体实现类。依赖倒置可以提高代码的灵活性和可维护性,使得模块之间的耦合度降低。 控制反转(Inversion of Control),简称IOC,是指控制流程的反转。传统的程序设计,程序员负责控制对象的创建和生命周期,而在IOC,这些控制权被反转给了容器或框架。它包括依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)两种方式。 依赖注入(Dependency Injection)是指通过外部传递依赖对象的方式来实现对象之间的解耦。常见的方式有构造函数注入、属性注入和方法注入等。通过依赖注入,我们可以实现模块之间的松耦合,方便进行单元测试和代码重用。 依赖查找(Dependency Lookup)是指通过容器或框架提供的机制来查找和获取依赖对象。它与依赖注入相比,更加灵活,但也增加了代码的复杂性和对容器的依赖性。 综上所述,依赖倒置和控制反转是设计模式重要的概念,可以提高代码的可维护性和灵活性。依赖倒置通过抽象接口来定义模块之间的依赖关系,而控制反转则将对象的创建和生命周期的控制权交给了容器或框架。依赖注入和依赖查找是实现控制反转的两种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值