C 設計模式 外觀模式詳解

2021-09-05 07:22:09 字數 2681 閱讀 8748

外觀模式:要求乙個子系統與外部通訊必須通過乙個同一的系統完成,也就是把一系列的子系統封裝在乙個同一的大系統中。子系統中的所有呼叫行為都是通過大系統提供同一的介面來完成。

在乙個繪圖系統中,需要繪製各種這樣的圖形,比如說是矩形、圓形、直線等。那好我們就根據以上場景搭建乙個簡單的繪製場景。首先把各種繪製的圖形定義出來。

矩形:

//矩形

class myrectangle ;

myrectangle::myrectangle(int w, int h) 

void myrectangle::draw()

圓形:

//圓

class mycircle ;

mycircle::mycircle(int centerx, int centery, int radio) 

void mycircle::draw()

直線:

//直線

class myline ;

myline::myline(int firstx, int firsty, int secondx, int secondy) 

void myline::draw()

點:

//點

class mypoint ;

mypoint::mypoint(int x, int y) 

void mypoint::draw()

以上需要繪製的圖形已經新增完成了,下面看一下客戶端是如何呼叫的:

int main()
**編寫完成了,執行一下:

ok,呼叫完成了,看到了嗎?

也就是說我每次新增乙個繪製的圖形都要重寫一遍客戶端,如果新增的圖形比較複雜的,或者是有很多組合圖形的情況,客戶端就會變得非常的臃腫,不易於維護。

那麼怎麼解決的?咱們把需要繪製的這個部分功能重新封裝起來。需要重新定義乙個類實現這個功能。

class mydraw ;
mydraw::mydraw() 

void mydraw::init()

void mydraw::draw()

現在把客戶端的呼叫之後修改一下:

int main()
執行一下:

嗯哼,執行效果是一樣的。

客戶端只要編寫很少的**就可以實現上述的功能,也許你會說,這有什麼區別嘛?只不過把我需要的功能重新封裝了一下而已呀。

但是你不要忘了,如果直接使用的話,各種繪製圖形就會和客戶端產生一定的耦合性,如果是客戶端做了修改就會影響到這部分的修改,但是如果做了封裝的話就是把客戶端和實際的繪製過程分開來,互不影響。

每次需要繪製的時候,只要把封裝的介面直接呼叫就可以了。

其次,如果想要新增新的繪製圖形,比如說三角形、等,只要在封裝的類中新增行的繪製就可以了,而不用修改客戶端的**。

再次,如果這部分繪製的過程是通過dll形式發布出去的,那麼每次只要修改dll中**之後重新編譯就可以了,和客戶端沒有什麼關係,客戶端沒有修改任何**就能實現的新增新的繪製圖形。

看看咱們的**是不是還有優化的空間?

既然會都有繪製的功能,是不是可以把繪製的過程提取出來形成基類呢?

class idraw ;
idraw::idraw() 

idraw::~idraw()

void idraw::draw()

//矩形

class myrectangle:public idraw ;

//圓class mycircle :public idraw ;

//直線

class myline :public idraw ;

//點class mypoint :public idraw ;

cpp檔案保持不變,這裡就不在重複了。

然後在修改一下繪製類:

class mydraw ;
mydraw::mydraw() 

void mydraw::init()

void mydraw::draw()

}

這樣是不是更加方便了,客戶端都有不用做任何的修改!

如果要新增新的圖形,只要是繼承idraw這個基類,然後在子類中完成繪製功能,把生成的子類物件,新增到_drawobjs中就可以了。繪製這部分功能就會自動的呼叫完成了。

外觀模式優點:

1.減少了系統之間的耦合性。

2.提高靈活性。

詳解設計模式 外觀模式

外觀模式 facade 為子系統中的一組介面提供乙個一致的介面,facade 模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。隱藏系統的複雜性,並向客戶端提供了乙個客戶端可以訪問系統的介面。降低訪問複雜系統的內部子系統時的複雜度。類圖 在客戶端和複雜系統之間再加一層,將呼叫順序 依賴關係...

C 設計模式 Facade 外觀模式詳解

外觀模式的適用場景 外觀模式的優缺點 在軟體開發中,有時候為了完成一項較為複雜的功能,乙個客戶類需要和多個業務類互動,而這些需要互動的業務類經常會作為乙個整體出現,由於涉及到的模擬較多,導致使用時 較為複雜,此時,特別需要乙個類似服務員一樣的角色,由它來負責和多個業務類進行互動,而客戶類只需與該類互...

設計模式詳解(十一) 外觀模式

今天我們來介紹外觀模式,考慮外觀模式較為簡單且非常常見 平時開發中所處可見 就直接開門見山。外觀模式 facade pattern 又叫作門面模式,是一種通過為多個複雜的子系統提供乙個一致的介面,而使這些子系統更加容易被訪問的模式。該模式對外有乙個統一介面,外部應用程式不用關心內部子系統的具體細節,...