七大设计原则-依赖传递原则

前言

设计模式相关文章主要来自B站尚硅谷的学习视频的心得 B站视频传送门

设计模式系列文章传送门23种设计模式系列合集

有空会慢慢更新学习心得,相关源码在 Github


基本介绍

依赖倒转原则(Dependence Inversion Principle)是指:

  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象

  • 抽象不应该依赖细节,细节应该依赖抽象

  • 依赖倒转(倒置)的中心思想是面向接口编程

  • 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的 架构要稳定的多。在 java 中,抽象指的是接口或抽象类,细节就是具体的实现类

  • 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

应用实例

  • 实现方案 1 + 分析说明
package learn.lhb.design.patterns.principle.inversion;

/**
 * 依赖倒转原则案例 1
 * 有缺陷,解决方案看下面
 *
 * @author 梁鸿斌
 * @date 2020/3/16.
 * @time 21:29
 */
public class DependecyInversion1 {

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

/**
 * 电子邮件类
 */
class Email {
    public String getInfo() {
        return "电子邮件信息: 你好";
    }
}

/**
 * // 完成接受消息的功能
 * // 方式一完成
 * 1. 简单,比较容易想到
 * 2. 如果获取对象是微信,短信等等,则需要新增对应的类,同时Person类也要增加相应的接收方法
 * 3. 解决思路: 引入一个抽象的接口,IReceiver,表示接收者,这样Person类与接口IReceiver发生依赖
 *      因为Email WeChat 等等都是接收的范围,他们仅需要各自实现IReceiver 接口即可,这样就符合依赖倒转原则
 *
 */
class Person {

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

实现方案 2(依赖倒转) + 分析说明

package learn.lhb.design.patterns.principle.inversion.improve;

/**
 * 依赖倒转原则案例 2
 *
 * @author 梁鸿斌
 * @date 2020/3/16.
 * @time 21:37
 */
public class DependecyInversion2 {

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


/**
 * 定义接口
 */
interface IReceiver {
    /**
     * 抽象方法
     * @return
     */
    public String getInfo();
}

/**
 * 电子邮件类
 */
class Email implements IReceiver {

    @Override
    public String getInfo() {
        return "电子邮件信息: 你好";
    }
}

/**
 * 增加微信
 */
class WeChat implements IReceiver {

    @Override
    public String getInfo() {
        return "微信信息: 你好";
    }
}

/**
 * // 完成接受消息的功能
 * // 方式2
 *
 */
class Person {

    public void receive(IReceiver iReceiver) {
        System.out.println(iReceiver.getInfo());
    }
}

依赖关系传递的三种方式和应用案例

  • 接口传递
  • 构造方法传递
  • setter方法传递
  • 代码演示
package learn.lhb.design.patterns.principle.inversion.improve;

/**
 * 依赖传递原则的三种实现方式
 * 1. 通过接口传递
 * 2. 通过构造方法传递
 * 3. 通过setter属性传递
 *
 * @author 梁鸿斌
 * @date 2020/3/16.
 * @time 21:48
 */
public class DependencyPass {
    public static void main(String[] args) {
        /**
         * 方法一的使用,接口Å
         */
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.open(changHong);

        /**
         * 方法二的使用,构造方法
         */
        XiMenZi xiMenZi = new XiMenZi();
        OpenAndClose2 openAndClose2 = new OpenAndClose2(xiMenZi);
        openAndClose2.open();

        /**
         * 方法3 的使用, setter
         */
        SanXing sanXing = new SanXing();
        OpenAndClose3 openAndClose3 = new OpenAndClose3();
        openAndClose3.setTv(sanXing);
        openAndClose3.open();

    }
}

/**
 * 方式1: 通过接口传递实现依赖
 * 开关的接口
 */
interface IOpenAndClose {
    /**
     * 抽象方法,接收接口
     * @param tv
     */
    public void open(ITV tv);
}
/**
 * ITV接口
 */
interface ITV {
    public void play();
}
/**
 * 实现接口
 */
class OpenAndClose implements IOpenAndClose {
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}
class ChangHong implements ITV {

    @Override
    public void play() {
        System.out.println("打开长虹电视机");
    }
}



/**
 * 方式2 通过构造方法传递依赖
 */
interface IOpenAndClose2 {
    /**
     * 抽象方法
     */
    public void open();
}
interface ITV2 {
    /**
     * ITV2 接口
     */
    public void play();
}
class OpenAndClose2 implements IOpenAndClose2 {
    /**
     * 成员
     */
    public ITV2 itv2;

    @Override
    public void open() {
        this.itv2.play();
    }

    /**
     * 构造器
     * @param itv2
     */
    public OpenAndClose2(ITV2 itv2) {
        this.itv2 = itv2;
    }
}
class XiMenZi implements ITV2 {

    @Override
    public void play() {
        System.out.println("打开西门子电视机");
    }
}

/**
 * 方式3 , 通过setter方法传递
 */
interface IOpenAndClose3 {
    /**
     * 抽象方法
     */
    public void open();

    public void setTv(ITV3 tv);
}
interface ITV3 {
    public void play();
}
class OpenAndClose3 implements IOpenAndClose3 {
    private ITV3 itv3;

    @Override
    public void open() {
        this.itv3.play();
    }

    @Override
    public void setTv(ITV3 tv) {
        this.itv3 = tv;
    }
}
class SanXing implements ITV3 {

    @Override
    public void play() {
        System.out.println("打开三星电视机");
    }
}

有问题欢迎私信/评论指出,谢谢您的观看,希望对您有帮助哦!
https://lianghongbin.blog.csdn.net/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个巨大的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值