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

依赖倒转原则(Dependence Inversion Principle)注意事项

  • 高层模块不应该依赖(使用)底层模块,二者都应该依赖其抽象
  • 底层模块尽量要有抽象类或者接口,程序稳定性更好
  • 变量的声明类型尽量是抽象类或者接口,变量引用于实际对象之间会存在一个缓冲层,利于程序的扩展优化(eg:在替换变量的实现类时,只需要修改当前变更位置,而不用修改其余调用位置)
  • 细节(实现类)应该依赖抽象(接口、抽象类),抽象不应该依赖细节
  • 依赖倒转的中心思想是面向接口编程
  • 相对于细节的多变性,抽象的东西要更稳定。以抽象为基础搭建的框架比以细节为基础的架构要稳定的多。
  • 抽象指的是接口或者抽象类,细节就是具体的实现类
  • 使用接口或抽象类的目的是制定好规范,不涉及的任何具体的操作,展现细节的工作要由实现类去完成

采用依赖实现方式实现功能

class Dollar{
    //获取美元数量
    public int getCount(){
        return 10;
    }
    //获取汇率
    public double getExchangeRate(){
        return 6.5;
    }
}

/**
 * 完成blank外币兑换的功能
 */
class Blank{
    /**
     * 实现方式一:依赖细节
     * 带来的问题:如果要兑换的外币是欧元、英镑等,需要新增类。同时blank类也需要增加相应的转换方法。扩展性差
     * @param dollar 美元
     */
    public void convert(Dollar dollar){
        double rmb = dollar.getCount() * dollar.getExchangeRate();
    }
}

采用依赖倒转原则来实现代码

class Dollar implements IConvert {
    //获取美元数量
    public int getCount() {
        return 10;
    }

    //获取汇率
    public double getExchangeRate() {
        return 6.5;
    }

    @Override
    public double convert() {
        return this.getExchangeRate() * this.getCount();
    }
}
//转化接口
interface IConvert {
    public double convert();
}

/**
 * 完成blank外币兑换的功能
 */
class Blank {
    /**
     * 实现方式二:依赖抽象
     * 兑换英镑、欧元blank不需要再新增转换方法
     * @param c 转换接口
     */
    public void convert(IConvert c) {
        c.convert();
    }
}

依赖关系传递的三种方式

  • 通过接口传递

//打开接口
interface IOpen {
    /**
     * 打开方法,如果依赖主机的实现类(PS5/Xbox/Switch),就必须要定义多个打开接口,违反依赖倒转原则
     * eg: public void open1(PS5 ps5)
     *     public void open2(Xbox xbox)
     *     public void open3(Switch switch)
     * 通过IMainframe接口传递依赖
     * @param mainframe 抽象接口,打开主机
     */
    public void open(IMainframe mainframe);
}
//主机接口
interface IMainframe {
    //玩游戏
    public void play();
}
//设备类
class Equipment implements IOpen {
    @Override
    public void open(IMainframe mainframe) {
        mainframe.play();
    }
}
  • 通过构造方法传递

//打开接口
interface IOpen {
    //打开方法
    public void open();
}

//主机接口
interface IMainframe {
    //玩游戏
    public void play();
}

//设备类
class Equipment implements IOpen {
    private IMainframe mainframe;

    //构造方法传递依赖
    public Equipment(IMainframe mainframe) {
        this.mainframe = mainframe;
    }

    @Override
    public void open() {
        mainframe.play();
    }
}
  • 通过setter方法传递

//打开接口
interface IOpen {
    //打开方法
    public void open();
    //set方法传递依赖
    public void set(IMainframe mainframe);
}

//主机接口
interface IMainframe {
    //玩游戏
    public void play();
}

//设备类
class Equipment implements IOpen {
    private IMainframe mainframe;

    @Override
    public void set(IMainframe mainframe) {
        this.mainframe = mainframe;
    }

    //调用前需要先调用 set方法
    @Override
    public void open() {
        mainframe.play();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值