日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式-模板方法

發布時間:2024/10/8 asp.net 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式-模板方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、?模板方法(Template Method)模式

準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模版方法模式的用意。

很多人可能沒有想到,模版方法模式實際上是所有模式中最為常見的幾個模式之一,而且很多人可能使用過模版方法模式而沒有意識到自己已經使用了這個模式。模版方法模式是基于繼承的代碼復用的基本技術,模版方法模式的結構和用法也是面向對象設計的核心。

模 版方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個算法的輪廓和骨架,另一些設計師則負責給出這個算法的各個邏輯步驟。代表 這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本法方法總匯起來的方法叫做模版方法(template method),這個設計模式的名字就是從此而來。


二、?模版方法模式的結構

模版方法模式的靜態結構如下圖所示。

?

這里涉及到兩個角色:

  • 抽象模版(AbstractClass)角色有如下的責任:

定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。

定義并實現了一個模版方法。這個模版方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。

  • 具體模版(ConcreteClass)角色有如下的責任:

實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。

每一個抽象模版角色都可以有任意多個具體模版角色與之對應,而每一個具體模版角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。


三、?模板方法模式的示意性代碼

//?Template?Method?pattern?--?Structural?example??
using?System;

//?"AbstractClass"
abstract?class?AbstractClass
{
??
//?Methods
??abstract?public?void?PrimitiveOperation1();
??
abstract?public?void?PrimitiveOperation2();

??
//?The?Template?method
??public?void?TemplateMethod()
??
{
????Console.WriteLine(
"In?AbstractClass.TemplateMethod()");
????PrimitiveOperation1();
????PrimitiveOperation2();
??}

}


//?"ConcreteClass"
class?ConcreteClass?:?AbstractClass
{
??
//?Methods
??public?override?void?PrimitiveOperation1()
??
{
????Console.WriteLine(
"Called?ConcreteClass.PrimitiveOperation1()");
??}


??
public?override?void?PrimitiveOperation2()
??
{
????Console.WriteLine(
"Called?ConcreteClass.PrimitiveOperation2()");
??}

}


///?<summary>
///?Client?test
///?</summary>

public?class?Client
{
??
public?static?void?Main(?string[]?args?)
??
{
????
//?Create?instance?and?call?template?method
????ConcreteClass?c?=?new?ConcreteClass();
????c.TemplateMethod();
??}

}


四、?繼承作為復用的工具

使用繼承作為復用的手段必須慎重,C#語言的設計師對使用繼承作為復用的工具有著不同層次上的認識。

不知其一

首先,初學C#的程序員可能不知道什么是繼承,或者認為"繼承"是高深的工具。那時候,大部分的功能復用都是通過委派進行的。

知其一、不知其二

然后慢慢地,他們發現在C#語言里實現繼承并不困難,并且初步認識到繼承可以使子類一下子得到基類的行為。這時他們就會躍躍欲試了,試圖使用繼承作為功能復用的主要工具,并把原來應當使用委派的地方,改為使用繼承,這時繼承就有被濫用的危險。

知其二

很多面向對象的設計專家從1986年就開始警告繼承關系被濫用的可能。有一些面向對象的編程語言,如SELF語言,甚至將類的繼承關系從語言的功能中取消掉,改為完全使用委派。

其 他的設計師雖然不提倡徹底取消繼承,但無一例外地鼓勵在設計中盡可能使甩委派關系代替繼承關系。比如在【GOF95】一書中,狀態模式、策略模式、裝飾模 式、橋梁模式以及抽象工廠模式均是將依賴于繼承的實現轉換為基于對象的組合和聚合的實現,這些模式的要點就是使用委派關系代替繼承關系。

知其三

是不是繼承就根本不該使用呢?事實上對數據的抽象化、繼承、封裝和多態性并稱C#和其他絕大多數的面向對象語言的幾項最重要的特性。繼承不應當被濫用,并不意味著繼承根本就不該使用。因為繼承容易被濫用就徹底拋棄繼承,無異于因噎廢食。

繼 承使得類型的等級結構易于理解、維護和擴展,而類型的等級結構非常適合于抽象化的設計、實現和復用。盡管【GOF95】所給出的設計模式基本上沒有太多基 于繼承的模式,很多模式都是用繼承的辦法定義、實現接口的。多數的設計模式都描寫一個以抽象類作為基類,以具體類作為實現的等級結構,比如適配器模式、合 成模式、橋梁模式、狀態模式等。

模版方法模式則更進了一步:此模式鼓勵恰當地使用繼承。此模式可以用來改寫一些擁有相同功能的相關的類,將可復用的一般性的行為代碼移到基類里面,而把特殊化的行為代碼移到子類里面。

因此,熟悉模版方法模式便成為一個重新學習繼承的好地方。


五、?一個實際應用模板方法的例子

下面的例子演示了數據庫訪問的模板方法。實際應用時,請確保C盤根目錄下有nwind.mdb這個Access數據庫(可以從Office的安裝目錄下找到。中文版用戶的請注意字段名可能有所不同)。

//?Template?Method?pattern?--?Real?World?example??
using?System;
using?System.Data;
using?System.Data.OleDb;

//?"AbstractClass"
abstract?class?DataObject
{
??
//?Methods
??abstract?public?void?Connect();
??
abstract?public?void?Select();
??
abstract?public?void?Process();
??
abstract?public?void?Disconnect();

??
//?The?"Template?Method"
??public?void?Run()
??
{
????Connect();
????Select();
????Process();
????Disconnect();
??}

}


//?"ConcreteClass"
class?CustomerDataObject?:?DataObject
{
??
private?string?connectionString?=
????
"provider=Microsoft.JET.OLEDB.4.0;?"
????
+?"data?source=c:\\nwind.mdb";
??
private?string?commandString;
??
private?DataSet?dataSet;
?
??
//?Methods
??public?override?void?Connect(?)
??
{
????
//?Nothing?to?do
??}


??
public?override?void?Select(?)
??
{
????commandString?
=?"select?CompanyName?from?Customers";
????OleDbDataAdapter?dataAdapter?
=?new?OleDbDataAdapter(
??????commandString,?connectionString?);
????dataSet?
=?new?DataSet();
????dataAdapter.Fill(?dataSet,?
"Customers"?);
??}


??
public?override?void?Process()
??
{
????DataTable?dataTable?
=?dataSet.Tables["Customers"];
????
foreach(?DataRow?dataRow?in?dataTable.Rows?)
??????Console.WriteLine(?dataRow[?
"CompanyName"?]?);
??}


??
public?override?void?Disconnect()
??
{
????
//?Nothing?to?do
??}

}


///?<summary>
///??TemplateMethodApp?test
///?</summary>

public?class?TemplateMethodApp
{
??
public?static?void?Main(?string[]?args?)
??
{
????CustomerDataObject?c?
=?new?CustomerDataObject(?);
????c.Run();
??}

}

?

六、?模版方法模式中的方法

模版方法中的方法可以分為兩大類:模版方法(Template Method)和基本方法(Primitive Method)。

模版方法

一個模版方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總算法或一個總行為的方法。這個模版方法一般會在抽象類中定義,并由子類不加以修改地完全繼承下來。

基本方法

基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

抽象方法:一個抽象方法由抽象類聲明,由具體子類實現。在C#語言里一個抽象方法以abstract關鍵字標示出來。

具體方法:一個具體方法由抽象類聲明并實現,而子類并不實現或置換。在C#語言里面,一個具體方法沒有abstract關鍵字。

鉤 子方法:一個鉤子方法由抽象類聲明并實現,而子類會加以擴展。通常抽象類給出的實現是一個空實現,作為方法的默認實現。(Visual FoxPro中項目向導建立的項目會使用一個AppHook類實現監視項目成員變化,調整系統結構的工作。)鉤子方法的名字通常以do開始。


七、?重構的原則

在對一個繼承的等級結構做重構時,一個應當遵從的原則便是將行為盡量移動到結構的高端,而將狀態盡量移動到結構的低端。

1995年,Auer曾在文獻【AUER95】中指出:

  • 應當根據行為而不是狀態定義一個類。也就是說,一個類的實現首先建立在行為的基礎之上,而不是建立在狀態的基礎之上。
  • 在實現行為時,是用抽象狀態而不是用具體狀態。如果一個行為涉及到對象的狀態時,使用間接的引用而不是直接的引用。換言之,應當使用取值方法而不是直接引用屬性。
  • 給操作劃分層次。一個類的行為應當放到一個小組核心方法(Kernel Methods)里面,這些方法可以很方便地在子類中加以置換。
  • ?將狀態屬性的確認推遲到子類中。不要在抽象類中過早地聲明屬性變量,應將它們盡量地推遲到子類中去聲明。在抽象超類中,如果需要狀態屬性的話,可以調用抽象的取值方法,而將抽象的取值方法的實現放到具體子類中。
  • 如果能夠遵從這樣的原則,那么就可以在等級結構中將接口與實現分隔開來,將抽象與具體分割開來,從而保證代碼可以最大限度地被復用。這個過程實際上是將設計師引導到模版方法模式上去。

    轉載于:https://www.cnblogs.com/zhuxiongfeng/archive/2010/04/09/1708615.html

    總結

    以上是生活随笔為你收集整理的设计模式-模板方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品不卡一区二区 | 日韩日韩日韩日韩日韩 | 国产精品丝袜黑色高跟鞋的设计特点 | 第一页在线 | 东北女人av| 日韩网站免费 | 理论片琪琪午夜电影 | 天天操天天添 | 亲嘴扒胸摸屁股免费视频日本网站 | 在线欧美日韩 | 色播基地 | 美女考逼| 小辣椒福利视频导航 | 两性动态视频 | 东北少妇高潮抽搐 | 日韩av电影网址 | 91久久国产综合久久91 | 狠狠人妻久久久久久 | 精品国产一区二区三区av性色 | 一区二区三区四区免费 | 黄色三级免费网站 | 色黄网站 | 久久小视频 | 亚洲欧洲日本一区二区三区 | 在线观看av的网站 | 美国做爰xxxⅹ性视频 | www.日 | 欧美日韩在线视频观看 | 成人颜色网站 | 亚洲国产高清在线 | 日本在线一区 | 黑白配av | 开心春色激情网 | 久草91| 男人天堂手机在线观看 | 六月激情综合 | 动漫av在线免费观看 | 中文亚洲av片不卡在线观看 | 美女黄色在线观看 | 97成人免费视频 | 丝袜制服一区 | 久久综合干 | 最近国语视频在线观看免费播放 | 在线看91| 国产一区二区三区四区在线观看 | 亚洲无码精品免费 | 亚洲永久精品一区二区 | 贝利弗山的秘密在线观看 | 婷婷五月综合久久中文字幕 | 九草影院 | 最近中文字幕免费mv视频7 | 5a毛片 | 久久久人体 | 捆绑调教视频网站 | 国产成人网 | 黄色成人在线免费观看 | 少妇无套高潮一二三区 | 亚洲视频大全 | 国产一区二区啪啪啪 | 久久伊人免费 | 女女同性女同一区二区三区九色 | 原创少妇半推半就88av | 宗合久久 | 性感美女一级片 | av在线男人天堂 | 蜜臀一区二区三区 | 看黄色网址 | 一级成人免费视频 | 午夜激情在线视频 | 欧美一区二区三区免费观看 | 一二三区不卡 | 亚洲啪啪网 | 中文字字幕码一二三区 | 欧美精品久久久久久久多人混战 | 国产一区二区三区四区在线观看 | 国产精品人人妻人人爽人人牛 | 97视频免费观看 | 干美女少妇 | 久久中文字幕在线观看 | 天堂在线中文 | 九九热在线视频免费观看 | 精品久久久久久久久久久国产字幕 | 精品黄色 | 91精品成人 | 日韩在线视频不卡 | 少妇情理伦片丰满午夜在线观看 | 青青草成人网 | 玉女心经是什么意思 | av作品在线 | 日韩激情图片 | 日韩精品卡通动漫网站 | 日本免费高清视频 | 国产成人福利 | 中文字幕亚洲一区 | 男生草女生视频 | 天堂无乱码 | 欧美在线一二 | 国产精品久久久久久久一区探花 | 无码人妻丰满熟妇区毛片18 |