詳解C#設(shè)計(jì)模式編程中的模板方法模式使用
一、引言
提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現(xiàn)實(shí)生活中,模板的概念就是——有一個(gè)規(guī)定的格式,然后每個(gè)人都可以根據(jù)自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之后我們可以根據(jù)自己的情況填充不同的內(nèi)容要完成屬于自己的簡歷。在設(shè)計(jì)模式中,模板方法模式中模板和生活中模板概念非常類似,下面讓我們就詳細(xì)介紹模板方法的定義,大家可以根據(jù)生活中模板的概念來理解模板方法的定義。
二、模板方法模式詳細(xì)介紹
2.1 模板方法模式的定義
模板方法模式——在一個(gè)抽象類中定義一個(gè)操作中的算法骨架(對應(yīng)于生活中的大家下載的模板),而將一些步驟延遲到子類中去實(shí)現(xiàn)(對應(yīng)于我們根據(jù)自己的情況向模板填充內(nèi)容)。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)前提下,重新定義算法的某些特定步驟,模板方法模式把不變行為搬到超類中,從而去除了子類中的重復(fù)代碼。
2.2 模板方法模式的實(shí)現(xiàn)
在這里以實(shí)現(xiàn)一個(gè)公司的薪資系統(tǒng)為例介紹一下模板方法的應(yīng)用。
首先定義抽象類,一般建議將抽象的操作定義為非虛public方法,將子類需要定義的特定步驟定義為抽象的protected方法。
publicabstractclass Employee { publicvoid GetSalary() { GetBasicSalary(); AddBonus(); } protectedabstractvoid GetBasicSalary(); protectedabstractvoid AddBonus(); }
接著分別實(shí)現(xiàn)經(jīng)理和CEO的薪資
publicclass Manager : Employee { protectedoverridevoid GetBasicSalary() { Console.WriteLine("Get Manager Basic Salary"); } protectedoverridevoid AddBonus() { Console.WriteLine("Add Manager Bonus"); } } publicclass CEO : Employee { protectedoverridevoid GetBasicSalary() { Console.WriteLine("Get CEO Basic Salary"); } protectedoverridevoid AddBonus() { Console.WriteLine("Add CEO Bonus"); } }
2.3 模板方法模式的結(jié)構(gòu)圖
模板方法是一種常見的設(shè)計(jì)模式,它定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。模板使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模板方法的結(jié)構(gòu)圖如下
模板方法模式中涉及了兩個(gè)角色:
(1)抽象模板角色(Vegetable扮演這個(gè)角色):定義了一個(gè)或多個(gè)抽象操作,以便讓子類實(shí)現(xiàn),這些抽象操作稱為基本操作。
(2)具體模板角色(ChineseCabbage和Spinach扮演這個(gè)角色):實(shí)現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法。
三、模板方法模式的優(yōu)缺點(diǎn)
下面讓我們繼續(xù)分析下模板方法的優(yōu)缺點(diǎn)。
1.優(yōu)點(diǎn):實(shí)現(xiàn)了代碼復(fù)用,能夠靈活應(yīng)對子步驟的變化,符合開放-封閉原則。
2.缺點(diǎn):因?yàn)橐肓艘粋€(gè)抽象類,如果具體實(shí)現(xiàn)過多的話,需要用戶或開發(fā)人員需要花更多的時(shí)間去理清類之間的關(guān)系。
附:在.NET中模板方法的應(yīng)用也很多,例如我們在開發(fā)自定義的Web控件或WinForm控件時(shí),我們只需要重寫某個(gè)控件的部分方法。
四、總結(jié)
到這里,模板方法的介紹就結(jié)束了,模板方法模式在抽象類中定義了算法的實(shí)現(xiàn)步驟,將這些步驟的實(shí)現(xiàn)延遲到具體子類中去實(shí)現(xiàn),從而使所有子類復(fù)用了父類的代碼,所以模板方法模式是基于繼承的一種實(shí)現(xiàn)代碼復(fù)用的技術(shù)。
上一篇:C# Base 64 編碼/解碼實(shí)現(xiàn)代碼
欄 目:C#教程
下一篇:深入解析C#設(shè)計(jì)模式編程中對建造者模式的運(yùn)用
本文標(biāo)題:詳解C#設(shè)計(jì)模式編程中的模板方法模式使用
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6678.html
您可能感興趣的文章
- 01-10C#編程實(shí)現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#中Socket通信用法實(shí)例詳解
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#編程自學(xué)之類和對象


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery