C语言,去你的策略模式!
前言
這里先插一點題外話,在C語言中,實現封裝、繼承、隱藏、多態等等特性,是完全沒有問題的。但是在使用過程中,必定是不如自帶這些特性的語言方便好用的,比如C \java等。
一旦要通過C語言來實現各種設計模式,必定會在嚴謹地維護類層次上造成非常繁瑣和臃腫的代碼。這是因為C /java等自帶一套面向對象的工具,而C語言要在代碼設計中,不斷地根據實際情況來創造面向對象的工具。
因此對于文章的內容,請大家主要關注、體會設計模式本身,更多地去考慮程序的可擴展性和可維護性。
文章本身是希望向C語言愛好者普及設計模式的知識,在所有的程序設計中,本意都是盡可能地簡單易懂。因此拋開設計模式的本意去討論程序的代碼實現優劣,是沒有任何意義的。
希望大家可以針對設計模式方面給文章提出一些改進的建議,本人可以保證,對于無惡意、有針對性的建議,一定會吸收接納、及時改正。
接下來是文章的正文部分。
模式動機
完成一項任務,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。
在軟件開發中也常常遇到類似的情況,實現某一個功能有多個途徑,此時可以使用一種設計模式來使得系統可以靈活地選擇解決途徑,也能夠方便地增加新的解決途徑。
簡單來說,策略模式就是用統一的方法接口分別對不同類型的數據進行訪問。
場景案例
場景:現在我們想用pc看一部電影,但是影片本身有多種播放格式。比如rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。
傳統代碼實現
... void main() { ... if (movie == avi) {..._/avi影片的播放策略 } else if (movie == rmvb) {..._/rmvb影片的播放策略 } else if ... }在上面的代碼實現中,把所有的功能代碼全部集中在一個函數里面完成了,隨著分支的擴展,整個函數會越來越臃腫,非常難以維護。我們應該把每個分枝的實現抽離出來,封裝在函數里面實現。
改進代碼實現1:
... void main() { if (movie == avi) {play_avi_movie();//avi影片的播放策略 } else if (movie == rmvb) {play_rmvb_movie();//rmvb影片的播放策略 } else if ... }在上面的代碼實現中,我們通過把分支代碼封裝起來,減少了主函數的復雜性。但是從更高的一層的抽象看,主函數其實不關心各種分支情況。它希望的是,在進行必要的配置工作以后,直接調用某一個函數接口就能完成功能。
因此,我們應該把各個分支函數抽離出來,統一用某個函數接口來表示。只要在程序中進行完配置工作以后,那么主函數接下來就能直接調用該函數接口。
改進代碼實現2:
void (*play_movie)();void set_movie(char movie) {if(movie == avi){play_movie = play_avi_movie;}else if(movie == rmvb){play_movie = play_rmvb_movie;}else if... }void main() { ... set_movie(); ... play_movie(); ... }這就是c語言中的策略模式,重點在于分離各個分支的實現函數,主程序只需要通過唯一的接口,就能完成相應功能,提高了程序的可維護性和擴展性。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C语言,去你的策略模式!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光纤接无线路由器方法光纤如何转换成无线路
- 下一篇: 外网怎么访问局域网如何访问局域网其他路由