设计模式之依赖倒置原则

这里写图片描述
在传统的过程式中,上层依赖于底层,当底层变化,上层也得跟着做出相应的变化。这就是面向过程的思想,弊端就是导致程序的复用性降低并且提高了开发的成本。

这里写图片描述
而面向对象的开发则很好的解决了这个问题,让用户程序依赖于抽象层,实现层也依赖于抽象层,而抽象层一般不会轻易变化。即使实现变化,只要抽象不变,客户程序就不用变化,这大大降低了客户程序与实现细节的耦合度。

就好比实例中电脑由硬盘、CPU、内存组成,而这些硬件又有很多种类和品牌,组装电脑时,我们只管装抽象的硬件如硬盘而不管具体是什么牌子的硬盘,这要即使你硬盘的品牌变化了,也不会影响将硬盘这种硬件装进电脑中。这里硬盘就是一个抽象类,如果没有这个抽象层,直接将电脑和具体的硬盘品牌或者类型进行连接,一旦你换成其他类型或者品牌的硬盘,你电脑的接口也得相应调整,增加了成本。
依赖倒置原则实例:

#include <iostream>// 硬盘的抽象类
class HardDisk
{
public:virtual void work() = 0;
};// 三星
class SanHardDisk : public HardDisk
{
public:void work(){printf ("三星硬盘正常工作....\n");}
};// CPU的抽象类
class CPU
{
public:virtual void work() = 0;
};//因特尔
class IntelCPU : public CPU
{
public:void work(){printf ("Intel CPU正常工作....\n");}
};// 内存的抽象类
class Memory
{
public:virtual void work() = 0;
};//金士顿
class JsdMemory : public Memory
{
public:void work(){printf ("金士顿 内存正常工作....\n");}
};class Computer
{
public:Computer(HardDisk *hd, CPU *cpu, Memory *my)    // 组装电脑{this->hd = hd;   // 组装硬盘this->cpu = cpu; // 组装CPUthis->my  = my;  // 组装内存}void work(){hd->work();    // 硬盘正常工作cpu->work();   // CPU正常工作my->work();    // 内存正常工作}
private:// 要有硬盘HardDisk  *hd;// 要有CPUCPU       *cpu;// 要有内存Memory    *my;
};int main()
{HardDisk  *hd  = NULL;CPU       *cpu = NULL;Memory    *my  = NULL;   // 生产一个电脑,定义一个电脑的对象hd = new SanHardDisk;cpu = new IntelCPU;my  = new JsdMemory;Computer cp(hd, cpu, my);// Computer cp(new SanHardDisk, new IntelCPU, new JsdMemory);cp.work();delete hd;delete cpu;delete my;return 0;
}class A
{
public:void func();// 增加新功能void func2();
};// 通过继承增加新功能
class B: public A
{
public:void func2();
};// 通过组合的办法
class C
{
public:void func(){a->func();// 增加新功能}
private:A *a;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@Transactional 详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Transactional 是声明式事务管理 编程中使用的注解 1 .添加位置 1&#xff09;接口实现类或接口实现方法上&#xff0c;而不是接口类中…

LiveGBS高性能GB28181国标流媒体服务流传输模式支持UDP、TCP被动、TCP主动模式

LiveGBS国标(GB28181)流媒体服务软件&#xff1a; 提供用户管理及Web可视化页面管理&#xff1b; 提供设备状态管理&#xff0c;可实时查看设备是否掉线等信息&#xff1b; 实时流媒体处理&#xff0c;PS&#xff08;TS&#xff09;转ES&#xff1b; 设备状态监测、云台控制、录…

通过人行横道线

学车中的通过人行横道线 人行横道线&#xff0c;俗称斑马线&#xff0c;是由一条一条的白色线组成的&#xff0c;主要是用来让行人穿越马路的。 驾驶员驾驶车辆通过人行横道时应该减速缓行&#xff0c;注意礼让行人。 考核要求 当驾车进入路面有施划人行横道线的&#xf…

python学习-38迭代器和生成器

迭代器和生成器---- 迭代器协议和for循环工作机制1.迭代器协议&#xff1a;对象必须提供一个next方法&#xff0c;执行该方法要么返回迭代中的下一项&#xff0c;要么引起一个Stoplteration异常&#xff0c;以终止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…

[转载]基于Aaf的数据拆分

(本文适于使用Aaf框架的开发者阅读) 1. 基本原理 在Aaf框架中&#xff0c;“对象”和“存储”的关系映射有一个关键的纽带StorageAlias&#xff0c;即“存储别名”&#xff0c;同样一个类型&#xff0c;在不同的存储别名下&#xff0c;可以自由映射到任意存储“位置”。  “位…

靠边停车

什么是靠边停车 靠边停车是大路考中一个指标很明确的考核项目&#xff0c;要求学员驾驶车辆使之靠边停下。 操作方法 1、停车前&#xff0c;要通过内、外后视镜观察后方和右侧交通情况&#xff0c;开右转向灯。 2、适量踩下制动踏板。 3、向右转动方向盘(第一把轮…

RuntimeException 和 Exception 区别、异常的子父级关系

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.java 将所有的错误封装为一个对象&#xff0c;其根本父类为Throwable, Throwable 有两个子类&#xff1a;Error 和 Exception。 2.Err…

通过路口

操作方法 1、让车减速 2、观察路口的情况 3、通过路口 注意事项 1、不要抢黄灯 2、不要开英雄车&#xff0c;即红灯亮起时通过路口的最后一辆车 3、控制车速&#xff0c;控制在50km/h以下 4、看到左右车都减速时&#xff0c;也马上减速 5、要左转…

C语言笔记(关键字)

gdb调试 gcc 源程序 -g&#xff1b;加gdb调试信息gdb可执行程序&#xff1b;&#xff08;gdb调试&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源码&#xff0c;按一下从main开始10行以此往后l n&#xff1a;查看n处上下10行的源码run&#xff1a;运行程序b&…

自定义 Git - Git 钩子 (自动部署)

Git 钩子 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 和其它版本控制系统一样&#xff0c;Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子&#xff1a;客户端的和…

变更车道

操作方法 1、观察与判断观察车辆后方、侧方和准备变更的车道上的交通流情况&#xff1b; 2、确认安全后&#xff0c;打开转向指示灯示意&#xff0c;并再次通过后视镜观察两侧道路上有无车辆超越&#xff0c;确认准备驶入的车道是否允许留有安全距离&#xff1b; 3…

C语言笔记(符号)

注释符号 几个似非而是的注释问题 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我们知道C语言里可以有两种注释方式&#xff1a;“/* */” 和 “ // ”。那么上面几条…

直线行驶

考核要求 保证跟车安全速度和安全距离&#xff0c;了解车辆行驶速度、注意观察路面状况&#xff0c;采取相应措施。不能有左右摆动、方向不稳的现象。 考试口诀 一.寻找中心 二.双眼锁定本车能通行的中心 三.心理想着走中间 四.双眼从本车前面最突出点的.中心…

java 命令: jmap 命令使用 ( 查看内存使用、设置 )

jdk安装后会自带一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照&#xff0c;从而可以离线分析堆&#xff0c;以检查内存泄漏&am…

第一节 接口概述 [转贴]

接口&#xff08;interface&#xff09;用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定&#xff0c;就可以抛开编程语言的限制&#xff08;理论上&#xff09;。接口可以从多个基接口继承&#xff0c;而类或结构可以实现多个接口。接口可以…

获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存

我们在利用C#开发桌面程序&#xff08;Winform&#xff09;程序的时候&#xff0c;经常需要获取一些跟系统相关的信息&#xff0c;例如用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存等。 首先需要引入命名空间&#xff1a; using System.Management; //…

只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来&#xff0c;中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络&#xff0c;“五纵五横”综合运输大通道基本贯通&#xff0c;一大批综合客运、货运枢纽站场&#xff08;物流园区&#xff09;投入运营&#xff0c;取得了一系列瞩目成果&am…

起步

什么是开车起步 起步&#xff0c;即发动汽车&#xff0c;使汽车开始走动。 操作方法 1、“踩”离合器 2、“挂”一档 3、“打”左转向灯&#xff08;提醒后车驾驶员注意安全避让&#xff09; 4、“鸣”号&#xff08;引起车辆周围的行人或机动车等注意&…

Linux 使用 jstat 命令查看 jvm 的 GC 情况

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Options&#xff0c;选项&#xff0c;我们一般使用 -gcutil 查看gc情况 vmid&#xff0c;VM的进程号&#xff0c;即当前运行的java进程号…

WKWebview加载本地图片时出现路径问题

出现问题情况是&#xff1a;将uiwebview换成wkwebview之后&#xff0c;之前将webview上那些图片放回本地下载后缓存的图片没办法在webview上找到&#xff0c;最后排查出原因是&#xff0c;wkwebview需要将图片和网页文件放在同个路径下。 具体实现方法如下(获取图片缓存的路径&…