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

本文探讨了依赖倒置原则在软件设计中的应用,通过实例演示如何通过接口和抽象类提升代码复用性和灵活性。讲解了如何避免重复代码并保持架构稳定,重点介绍了接口传递、构造方法传递和setter方式的依赖传递方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本介绍

依赖倒置原则是指:

  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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值