栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

基本介绍

依赖倒置原则是指:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/601636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号