首页 > 其他分享 >软件设计原则—依赖倒转原则

软件设计原则—依赖倒转原则

时间:2024-05-19 18:40:38浏览次数:14  
标签:原则 软件设计 void hardDisk cpu lmcode memory 倒转 public

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

image

下面看一个例子来理解依赖倒转原则:组装电脑

现要组装一台电脑,需要配件cpu,硬盘,内存条。只有这些配置都有了,计算机才能正常的运行。选择cpu有很多选择,如Intel,AMD等,硬盘可以选择希捷,西数等,内存条可以选择金士顿,海盗船等。

image

希捷硬盘类XiJieHardDisk)

package com.lmcode.principles.DependenceInversionPrinciple;

// 希捷硬盘
public class XiJieHardDisk {
    public void save(String data) {
        System.out.println("使用希捷硬盘存储数据" + data);
    }

    public String get() {
        System.out.println("使用希捷希捷硬盘取数据");
        return "数据";
    }
}

Intel处理器IntelCpu

package com.lmcode.principles.DependenceInversionPrinciple;

// Intel处理器
public class IntelCpu {
    public void run() {
        System.out.println("使用Intel处理器");
    }
}

金士顿内存条KingstonMemory

package com.lmcode.principles.DependenceInversionPrinciple;

// 金士顿内存条
public class KingstonMemory {
    public void save() {
        System.out.println("使用金士顿作为内存条");
    }
}

电脑Computer

package com.lmcode.principles.DependenceInversionPrinciple;

public class Computer {
    private XiJieHardDisk hardDisk;
    private IntelCpu cpu;
    private KingstonMemory memory;

    public IntelCpu getCpu() {return cpu;}
    public void setCpu(IntelCpu cpu) {this.cpu = cpu;}
    public KingstonMemory getMemory() {return memory;}
    public void setMemory(KingstonMemory memory) {this.memory = memory;}
    public XiJieHardDisk getHardDisk() {return hardDisk;}
    public void setHardDisk(XiJieHardDisk hardDisk) {this.hardDisk = hardDisk;}

    public void run() {
        System.out.println("计算机工作");
        cpu.run();
        memory.save();
        String data = hardDisk.get();
        System.out.println("从硬盘中获取的数据为:" + data);
    }
}

测试类main用来组装电脑。

package com.lmcode.principles.DependenceInversionPrinciple;

public class main {
    public static void main(String[] args) {
        // 创建组件对象
        XiJieHardDisk xiJieHardDisk = new XiJieHardDisk();
        IntelCpu intelCpu = new IntelCpu();
        KingstonMemory kingstonMemory = new KingstonMemory();
        // 创建电脑对象
        Computer computer = new Computer();
        // 组装
        computer.setCpu(intelCpu);
        computer.setHardDisk(xiJieHardDisk);
        computer.setMemory(kingstonMemory);
        // 运行
        computer.run();
    }
}

上面代码可以看到已经组装了一台电脑,但是似乎组装的电脑的cpu只能是Intel的,内存条只能是金士顿的,硬盘只能是希捷的,这对用户肯定是不友好的,用户有了机箱肯定是想按照自己的喜好,选择自己喜欢的配件。

根据依赖倒转原则进行改进:

代码我们只需要修改Computer类,让Computer类依赖抽象(各个配件的接口),而不是依赖于各个组件具体的实现类。

image

面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现

细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。

cpu接口,硬盘接口,内存条接口

package com.lmcode.principles.DependenceInversionPrinciplePro;

//cpu接口
public interface Cpu {
//    运行cpu
    public void run();
}
package com.lmcode.principles.DependenceInversionPrinciplePro;

// 硬盘接口
public interface HardDisk {
//    存储数据
    public void save(String data);
//    获取数据
    public String get();
}

package com.lmcode.principles.DependenceInversionPrinciplePro;

//内存条接口
public interface Memory {
    public void save();
}

实现类

package com.lmcode.principles.DependenceInversionPrinciplePro;

// Intel处理器
public class IntelCpu implements Cpu{
    public void run() {
        System.out.println("使用Intel处理器");
    }
}
package com.lmcode.principles.DependenceInversionPrinciplePro;

// 金士顿内存条
public class KingstonMemory implements Memory{
    public void save() {
        System.out.println("使用金士顿作为内存条");
    }
}
package com.lmcode.principles.DependenceInversionPrinciplePro;

// 希捷硬盘
public class XiJieHardDisk implements HardDisk{
    public void save(String data) {
        System.out.println("使用希捷硬盘存储数据" + data);
    }

    public String get() {
        System.out.println("使用希捷硬盘取数据");
        return "数据";
    }
}

Computer

此时声明组件不能声明具体的实现类,而是父接口类型的抽象

package com.lmcode.principles.DependenceInversionPrinciplePro;

public class Computer {
    //    声明组件不能声明具体的实现类,而是父接口类型的抽象
    private HardDisk hardDisk;
    private Cpu cpu;
    private Memory memory;

    public HardDisk getHardDisk() {
        return hardDisk;
    }

    public void setHardDisk(HardDisk hardDisk) {
        this.hardDisk = hardDisk;
    }

    public Cpu getCpu() {
        return cpu;
    }

    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }

    public Memory getMemory() {
        return memory;
    }

    public void setMemory(Memory memory) {
        this.memory = memory;
    }

    public void run() {
        System.out.println("计算机工作");
        cpu.run();
        memory.save();
        String data = hardDisk.get();
        System.out.println("从硬盘中获取的数据为:" + data);

    }
}

main

package com.lmcode.principles.DependenceInversionPrinciplePro;

public class main {
    public static void main(String[] args) {
        // 创建组件对象
        HardDisk hardDisk = new XiJieHardDisk();
        Cpu cpu = new IntelCpu();
        Memory memory = new KingstonMemory();
        // 创建电脑对象
        Computer computer = new Computer();
        // 组装
        computer.setCpu(cpu);
        computer.setHardDisk(hardDisk);
        computer.setMemory(memory);
        // 运行
        computer.run();
    }
}

此时加入需要换cpu,只需要创建一个cpu的类,实现cpu接口,然后再main中创建新的cpu然后作为参数传递

标签:原则,软件设计,void,hardDisk,cpu,lmcode,memory,倒转,public
From: https://www.cnblogs.com/lm02/p/18200583

相关文章

  • 软件设计原则—里氏代换原则
    里氏代换原则是面向对象设计的基本原则之一。里氏代换原则:任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。如果通过重写父类的方法来完成新的......
  • 软件设计原则—开闭原则
    在程序需要进行拓展的时候,不能去修改原有的代码,而是实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生......
  • 软件设计师(中级) 笔记
    软件设计师「学习路线」(推荐该顺序学习,按照先易后难排序)1、上午题—计算机系统(5~6分)1.cpu:cpu是硬件系统的核心功能:控制器(程序控制,操作控制)运算器(时间处理,数据处理)运算器:算术逻辑单元(ALU):实现算术运算和逻辑运算......
  • 设计原则
    单一功能原则:它规定一个类应该只有一个发生变化的原因,即一个类/方法只干一件事。开闭原则:对于扩展是开放的,但是对于修改是封闭的,这意味着在不修改一个软件实体的基础上去扩展其功能。依赖倒置原则:要底层实现尽量依赖抽象类与接口,方便系统间的解耦,有利于扩展与维护。合成复用原......
  • 项目管理十二原则
    价值驱动的项目管理知识体系第七版是新的基于价值的一个项目管理体系。包括了基于过程的项目管理,也包括了这个基于价值的新的项目管理体系。十二原则就是项目经理看待项目管理的十二个角度,十二个底线项目管理原则国家原则就是绝对不能突破的。什么是原则?原则属于价......
  • 不可变(immutable)设计原则
    我们先从Java的数据类型与类型检查说起数据类型数据类型是什么?数据类型是一组值以及可以对其执行的操作,比如:-boolean:Truthvalue(trueorfalse)-int:Integer(0,1,-47)-double:Realnumber(3.14,1.0,-2.1)-String:Text("Hello","example")而变量就是用特......
  • 软件设计师基础学习 十三
    十三、结构化开发方法13.1*系统分析与概述1,认识、理解当前的环境,获得当前系统的“物理模型”2.从当前系统的“物理模型”抽象出当前系统的“逻辑模型”3.对当前系统的“逻辑模型”进行分析和优化,建立目标系统的“逻辑模型”4.对目标系统的逻辑模型具体化(物理化),建立目标系......
  • 软件设计师基础学习 十四
    十四、面向对象技术14.1面向对象开发概念:对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的一个实体,是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成类:现实世界中实体的形式化描述,类将该实体的属性(数据)和操作(函数)封装在一起......
  • [实验感悟] 系列(1) 野外实验要遵循的几个原则
    关键词:野外实验、学生、遥感实验、种苗表型作者:ludwig1860日期:2024.5.15印象中有2年多没有亲自带学生野外实验了,甚至之前从来没有带学生进行过一次完整地、系统地、历经实验设计-方案制定-仪器准备-方法学习-细致考虑-野外实践-数据整理-数据处理整套流程的实验......
  • 软件设计模式概念篇
    创建型模式1、创建型模式(CreationalPattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。3、创建型......