設計模式之依賴倒置原則

這里寫圖片描述
在傳統的過程式中,上層依賴于底層,當底層變化,上層也得跟著做出相應的變化。這就是面向過程的思想,弊端就是導致程序的復用性降低并且提高了開發的成本。

這里寫圖片描述
而面向對象的開發則很好的解決了這個問題,讓用戶程序依賴于抽象層,實現層也依賴于抽象層,而抽象層一般不會輕易變化。即使實現變化,只要抽象不變,客戶程序就不用變化,這大大降低了客戶程序與實現細節的耦合度。

就好比實例中電腦由硬盤、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.pswp.cn/news/448304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448304.shtml
英文地址,請注明出處:http://en.pswp.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需要將圖片和網頁文件放在同個路徑下。 具體實現方法如下(獲取圖片緩存的路徑&…