設計模式-依賴倒轉模式(面向接口編程)

    閒談  

    在公司工做了快一年了,發現之前的重點是放在語言上的(C/C++),回過頭來看看,發現語言只是一種工具,實現咱們產品的一種實現方式。一個好的產品,在於它的設計框架、在於它的擴展性,靈活性,維護性,複用性(借用面向對象的四大好處)。mysql

     然而爲了實現一個好的產品,須要咱們來慢慢的積累,慢慢的從使用語言的角度上升到脫離語言,具備全局的意識,能夠利用一些設計模式或者框架來使咱們產品更加完美,複用。千里之行,始於足下。讓咱們一塊兒來開始學習設計模式吧。sql

    依賴倒轉模式   

    先來看看依賴倒轉原則吧,原話解釋是抽象不依賴細節,細節應該依賴於抽象。通俗的說,就是要面向接口來編程,多個模塊共同抽象出一個通用接口,各個模塊的實現都依賴於這個通用接口,之後模塊實現能夠改變,可是通用接口一直不變。這樣就減小了模塊間的耦合度,提升了模塊內的聚合度。數據庫

       

     之前咱們在開發項目時,大多都是要訪問數據庫的,因此咱們就把訪問數據庫代碼寫成了函數,每次作新的項目時,就去調數據庫函數,能夠說是高層模塊依賴低層模塊。當低層的數據庫模塊由mysql更換爲oralce時,全部的高層模塊調用低層模塊的代碼都須要修改,形成的巨大工做量可想而知。編程

     若是咱們對高層模塊對低層模塊的調用抽象出一個接口或者抽象類。高層模塊經過實例化接口類,而後調用接口類中提供的接口來調用低層模塊,徹底不用關心低層模塊是怎麼實現接口的;低層模塊經過繼承來實現接口,無需關心高層模塊怎麼調用。這樣就實現了程序模塊間的分離,即便後面低層模塊實現更改了,高層模塊也不用擔憂。或者是高層模塊的業務邏輯改變了,只要接口沒有變,低層也不用關心。設計模式

    電腦例子 

    舉個例子,電腦至關於一個咱們須要實現的產品,咱們定義了好了主板與CPU、硬盤、內存、顯卡之間的接口。生產CPU的廠商不論是Inter仍是AMD都只須要按照接口來實現CPU,無需關心其餘模塊;顯卡廠商只須要根據接口來實現顯卡,也無需關心其餘模塊。當咱們電腦某個模塊壞了,如內存條壞了,咱們只需更換一條內存條就行了,而沒有必要將電腦返廠進行整套檢測和維修。框架

    本身理解

    如何作到面向接口的編程,其實很簡單。面向接口編程的本質是:函數

    一、定義接口:能夠是多方共同定義一個統的接口,也但是客戶(需求方)提供一個接口     工具

    二、實現接口 :通常 是服務方經過實現接口,來完成客戶(需求方)的要求學習

    三、調用接口:客戶(需求方)經過調用定義的接口來完成與不一樣服務方的對接,無需關心是哪一方實現。spa

    C語言例子

    有些簡單,可是能夠引導一下你們

#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");
	}
}

輸出:

沙米水平有限,但願你們多多指導,一塊兒探討,一塊兒提升。

相關文章
相關標籤/搜索