在公司工做了快一年了,發現之前的重點是放在語言上的(C/C++),回過頭來看看,發現語言只是一種工具,實現咱們產品的一種實現方式。一個好的產品,在於它的設計框架、在於它的擴展性,靈活性,維護性,複用性(借用面向對象的四大好處)。mysql
然而爲了實現一個好的產品,須要咱們來慢慢的積累,慢慢的從使用語言的角度上升到脫離語言,具備全局的意識,能夠利用一些設計模式或者框架來使咱們產品更加完美,複用。千里之行,始於足下。讓咱們一塊兒來開始學習設計模式吧。sql
先來看看依賴倒轉原則吧,原話解釋是抽象不依賴細節,細節應該依賴於抽象。通俗的說,就是要面向接口來編程,多個模塊共同抽象出一個通用接口,各個模塊的實現都依賴於這個通用接口,之後模塊實現能夠改變,可是通用接口一直不變。這樣就減小了模塊間的耦合度,提升了模塊內的聚合度。數據庫
之前咱們在開發項目時,大多都是要訪問數據庫的,因此咱們就把訪問數據庫代碼寫成了函數,每次作新的項目時,就去調數據庫函數,能夠說是高層模塊依賴低層模塊。當低層的數據庫模塊由mysql更換爲oralce時,全部的高層模塊調用低層模塊的代碼都須要修改,形成的巨大工做量可想而知。編程
若是咱們對高層模塊對低層模塊的調用抽象出一個接口或者抽象類。高層模塊經過實例化接口類,而後調用接口類中提供的接口來調用低層模塊,徹底不用關心低層模塊是怎麼實現接口的;低層模塊經過繼承來實現接口,無需關心高層模塊怎麼調用。這樣就實現了程序模塊間的分離,即便後面低層模塊實現更改了,高層模塊也不用擔憂。或者是高層模塊的業務邏輯改變了,只要接口沒有變,低層也不用關心。設計模式
舉個例子,電腦至關於一個咱們須要實現的產品,咱們定義了好了主板與CPU、硬盤、內存、顯卡之間的接口。生產CPU的廠商不論是Inter仍是AMD都只須要按照接口來實現CPU,無需關心其餘模塊;顯卡廠商只須要根據接口來實現顯卡,也無需關心其餘模塊。當咱們電腦某個模塊壞了,如內存條壞了,咱們只需更換一條內存條就行了,而沒有必要將電腦返廠進行整套檢測和維修。框架
如何作到面向接口的編程,其實很簡單。面向接口編程的本質是:函數
一、定義接口:能夠是多方共同定義一個統的接口,也但是客戶(需求方)提供一個接口 工具
二、實現接口 :通常 是服務方經過實現接口,來完成客戶(需求方)的要求學習
三、調用接口:客戶(需求方)經過調用定義的接口來完成與不一樣服務方的對接,無需關心是哪一方實現。spa
有些簡單,可是能夠引導一下你們
#include <stdio.h> #include <string.h> /*定義函數指針類型 ==> 定義接口*/ typedef int (*Communication)(int sendID,int revID,char msg[100]); /*函數指針作函數參數 ==>調用接口,不論是誰實現的接口*/ int useComm(int sendID,int revID,char msg[100],Communication comcate) { int ret = 0; ret = comcate(sendID,revID,msg); if(ret == 0) { printf("Communication is normal.msg is %s\n",msg); } else { printf("Communication is error.reasonCode=%d\n",ret); } } /*華爲廠商實現接口*/ int CommunicationHW(int sendID,int revID,char msg[100]) { printf("sendID:%d send revID:%d msg is %s.(bad msg).\n @HW\n",sendID,revID,msg); return 1; } /*中興廠商實現接口*/ int CommunicationZTE(int sendID,int revID,char msg[100]) { printf("sendID:%d send revID:%d msg is %s.\n @ZTE\n",sendID,revID,msg); return 0; } int main() { int sendID = 1001; int revID = 2002; char msg[100] = {0}; int ret = 0; strcpy(msg,"hello 2002, I am 1001, I miss you !"); /*調用華爲廠商實現的接口*/ ret = useComm(sendID,revID,msg,CommunicationHW); if(ret != 0) { printf("HW Implement interface error,please not use HW\n"); } else { printf("HW Implement interface good,please use HW\n"); } /*調用中興廠商實現的接口*/ ret = useComm(sendID,revID,msg,CommunicationZTE); if(ret != 0) { printf("ZTE Implement interface error,please not use ZTE\n"); } else { printf("ZTE Implement interface good,please use ZTE\n"); } }
輸出:
沙米水平有限,但願你們多多指導,一塊兒探討,一塊兒提升。