JAVA设计原则:依赖倒转原则

依赖倒转原则

传统过程

在这里插入图片描述

传统的过程式设计倾向于使高层次的模块依赖于低层次的模块,抽象层依赖于具体的层次。例如上图中的,高级业务逻辑依赖中层模块,中层模块依赖于底层模块。

依赖倒转

在这里插入图片描述

实现层来依赖抽象层,抽象不应该依赖于细节,细节应该依赖于抽象,高层模块不依赖底层模块,两者都依赖抽象。

一、示例:组装电脑

在这里插入图片描述

1.1 MainBoard
//主板的抽象类
public abstract class MainBoard {
    public abstract void doSomething();
}
1.2 Memory
//内存的抽象类
public abstract class Memory {
    public abstract void doSomething();
}
1.3 HardDisk
//硬盘的抽象类
public abstract class HardDisk {
    public abstract void doSomething();
}
1.4 HuaSuoMainBoard
public class HuaSuoMainBoard extends MainBoard {
    public void doSomething() {
        System.out.println("华硕的主板");
    }
}
1.5 WeiXingMainBoard
public class WeiXingMainBoard extends MainBoard {
    public void doSomething() {
        System.out.println("微星的主板");
    }
}
1.6 JinShiDunMemory
public class JinShiDunMemory extends Memory {
    public void doSomething() {
        System.out.println("金士顿的内存");
    }
}
1.7 JinBangMemory
public class JinBangMemory extends Memory {
    public void doSomething() {
        System.out.println("金邦的内存");
    }
}
1.8 XiJieHardDisk
public class XiJieHardDisk extends HardDisk {
    public void doSomething() {
        System.out.println("希捷的硬盘");
    }
}
1.9 XiShuHardDisk
public class XiShuHardDisk extends HardDisk {
    public void doSomething() {
        System.out.println("西数的硬盘");
    }
}

第一种情况:
违反规则:高层模块依赖了底层模块,电脑是个高层模块,主板、内存、硬盘是底层模块,高层模块属性里面直接引用了底层,例如当主板故障需要更换时,不可以更换成其他品牌的了,只能是华硕
public class Computer {
    private HuaSuoMainBoard mainBoard;
    private JinShiDunMemory memory;
    private XiJieHardDisk disk;

    public String display() {
        return "Computer{" +
                "mainBoard=" + mainBoard +
                ", memory=" + memory +
                ", disk=" + disk +
                '}';
    }
	... getter and setter
}
第二种情况:
改造代码,让代码符合高层模块也依赖抽象模块
public class Computer {
    private MainBoard mainBoard;
    private Memory memory;
    private HardDisk hardDisk;

    public String display() {
        return "Computer{" +
                "mainBoard=" + mainBoard +
                ", memory=" + memory +
                ", disk=" + hardDisk +
                '}';
    }
    ... getter and setter
}
主函数:
public class MainClass {
    public static void main(String[] args){
        //这里符合里氏代换原则,父类一定适合子类
        Computer computer = new Computer();
        computer.setMainBoard( new HuaSuoMainBoard() );
        computer.setMemory( new JinShiDunMemory() );
        computer.setHardDisk( new XiJieHardDisk() );
        computer.display();
    }
}

二、实现依赖倒转原则
  • 工厂方法模式:https://blog.csdn.net/weixin_43912883/article/details/97378705

  • 模板方法模式:https://blog.csdn.net/weixin_43912883/article/details/101841035

  • 迭代模式:https://blog.csdn.net/weixin_43912883/article/details/101803964

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值