C語言設計模式--建設者模式(C語言案例)

前言

這裏先插一點題外話,在C語言中,實現封裝、繼承、隱藏、多態等等特性,是完全沒有問題的。但是在使用過程中,必定是不如自帶這些特性的語言方便好用的,比如C++\java等。

一旦要通過C語言來實現各種設計模式,必定會在嚴謹地維護類層次上造成非常繁瑣和臃腫的代碼。這是因爲C++/java等自帶一套面向對象的工具,而C語言要在代碼設計中,不斷地根據實際情況來創造面向對象的工具。

更多深層次的原因歡迎閱讀我前面的文章:記錄C語言面向對象的一些思考

因此對於文章的內容,請大家主要關注、體會設計模式本身,更多地去考慮程序的可擴展性可維護性

文章本身是希望向C語言愛好者普及設計模式的知識,在所有的程序設計中,本意都是儘可能地簡單易懂。因此拋開設計模式的本意去討論程序的代碼實現優劣,是沒有任何意義的。之前發表的c語言面向對象系列文章確實參考了網上很多資料和書籍,也借鑑了其中一些案例。但是代碼確實是自己完整實現的,並複製粘貼在菜鳥 C 在線工具進行驗證了(https://c.runoob.com/compile/11)。今後類似的借鑑、抄襲等等話題不想再次和大家爭論,容易傷和氣。畢竟只是希望大家能從我的文章有所收穫而已,不喜歡直接右上角關閉就好。

鑑於之前有部分讀者過於關注程序本身的功能性,更有甚者僅因爲某一兩方面見解不同就口出惡言。唯恐這樣下去只會把技術的圈子搞臭。因此以後的c語言設計模式將不再給出具體實現,只講解模式動機和設計思路。

希望大家可以針對設計模式方面給文章提出一些改進的建議,本人可以保證,對於無惡意、有針對性的建議,一定會吸收接納、及時改正。

接下來是文章的正文部分。

模式動機

無論是在現實世界中還是在軟件系統中,都存在一些複雜的對象,它們擁有多個組成部分,如汽車,它包括車輪、方向盤、發送機等各種部件。而對於大多數用戶而言,無須知道這些部件的裝配細節,也幾乎不會使用單獨某個部件,而是使用一輛完整的汽車,可以通過建造者模式對其進行設計與描述,建造者模式可以將部件和其組裝過程分開,一步一步創建一個複雜的對象。用戶只需要指定複雜對象的類型就可以得到該對象,而無須知道其內部的具體構造細節。

場景:使用程序畫一個小人,要求有頭、身體、兩手、兩腳。

傳統代碼實現:

void draw_head()
{
...
}
void draw_body()
{
...
}
void draw_hand()
{
...
}
void draw_foot()
{
...
}
//主程序
void main()
{
  draw_head();
  draw_body();
  draw_hand();
  draw_foot();
}

主程序在畫小人的時候,需要知道構造小人的所有具體函數,一旦小人的身體特徵發生變化(例如一個瘦子變成了胖子),就必須更改主程序的函數調用。但是主程序關心的是小人這一個完整的對象,而不是關心小人的具體構建過程。

解決方案

使用建設者模式,封裝複雜對象的創建過程,用戶無須關心該對象所包含的屬性以及它們的組裝方式。

#include <stdio.h>
//定義小人構建的抽象接口
typedef struct Persion  
{  
    void (*build_head)();
    void (*build_body)(); 
    void (*build_hand)(); 
    void (*build_foot)(); 
    void (*build_persion)(struct Persion* p); 
}s_persion;

//定義瘦小人構建的接口
void draw_thin_head()
{
...
}
void draw_thin_body()
{
...
}
void draw_thin_hand()
{
...
}
void draw_thin_foot()
{
...
}

//定義胖小人構建的接口
void draw_fat_head()
{
...
}
void draw_fat_body()
{
...
}
void draw_fat_hand()
{
...
}
void draw_fat_foot()
{
...
}


//主程序
void main()
{
  //定義構建小人抽象接口
  s_persion* people;
  //利用胖小人或者是瘦小人的具體接口來初始化抽象接口
  ...
  //調用抽象接口中的構建小人方法
  people->build_persion(s_persion* people);
}

修改後的主程序,不需要關心小人的具體構建過程,直接通過抽象接口中的構建方法即可獲取相應的對象。當小人的特徵發生變化,或者構建步驟發生變化,均無需改動主程序。提高了程序的可維護性和可拓展性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章