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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

老生常谈:装饰者模式

發(fā)布時間:2024/6/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老生常谈:装饰者模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

???? 網(wǎng)站新聞模塊應用裝飾模式

???? 本人現(xiàn)今對設計模式特別感興趣,因為它的功能實在是太吸引人啦.設計模式一般說來是為了增加系統(tǒng)的可擴展性及維護性。在一般的門戶網(wǎng)站中都會有新聞展示這個功能模塊。

???? 具體案例:有存儲在數(shù)據(jù)庫中的新聞,有存儲在XML文件中的新聞(一般都是推薦新聞,內(nèi)容比較少)。

???? 在沒有接觸設計模式時,都是針對具體實現(xiàn)編程,讀取數(shù)據(jù)庫新聞時直接寫一個基于數(shù)據(jù)庫的方法,讀取推薦新聞時再寫一個基于XML的方法,兩種方法之間沒有任何的關(guān)系.當時覺的這樣實現(xiàn)也沒什么不好??墒悄憧倳l(fā)現(xiàn)這兩種方法在實現(xiàn)上有很多相同的地方,都是讀取出一個新聞標題集合來綁定數(shù)據(jù)源,只是取數(shù)據(jù)源的方法不同而已。為了方便管理,我們可以定義一個統(tǒng)一的接口來約束這兩種方法。這種做法也足夠滿足讀取不同載體的新聞要求。可是如果在讀取新聞時要做其它的操作呢?例如:給讀取出來的新聞的人氣加一。這個時候我們就要修改原程序,這樣有背于"對擴展開放,對修改關(guān)閉"的編程原則。如何解決呢?這就是裝飾者模式出場的時候了。

???? 裝飾者模式 :動態(tài)地將責任附加到對象上.若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

???? 裝飾者模式類圖:
??????????
??
?

??? 問題:? 說裝飾者模式比用繼承會更富有彈性,在類圖中不是一樣用到了繼承了嗎?

??? 說明:裝飾者和被裝飾者之間必須是一樣的類型,也就是要有共同的超類。在這里應用繼承并不是實現(xiàn)方法的復制,而是實現(xiàn)類型的匹配。因為裝飾者和被裝飾者是同一個類型,因此裝飾者可以取代被裝飾者,這樣就使被裝飾者擁有了裝飾者獨有的行為。根據(jù)裝飾者模式的理念,我們可以在任何時候,實現(xiàn)新的裝飾者增加新的行為。如果是用繼承,每當需要增加新的行為時,就要修改原程序了。

???? 說了一些裝飾者模式的類圖和概念,下面就要講新聞模塊和裝飾者模式的關(guān)聯(lián)了。

??? 例如:在展示新聞的同時給讀取出來的新聞的人氣加一,同時把新聞標題加入到RSS中,如果是用繼承,就要往超類中增加相應的方法,如果是一個新增行為還是可以忍受的,如果此模塊有不斷增加業(yè)務的可能,那是不是要每次都要修改原程序呢?我想所有的朋友都不希望這樣做。我們希望當有新的行為時才往舊對象上加,是在運行時加,并不是一開始就加。
???
??? 解決方案:這里我應用裝飾者模式設計來滿足這種不斷新增業(yè)務的需求:

????
??? 1:定義根據(jù)不同載體讀取新聞方法的抽象類:
???

Code
public?abstract??class?Component_News
????
{
???????
/**////?<summary>
????????
///?取新聞
????????
///?</summary>
????????
///?<returns></returns>

???????public?abstract?List<News>?getListOfNews();
????}

????

??? 2:基于數(shù)據(jù)庫讀取新聞的類:

??

Code
public?class?DB_News?:?Component_News
????
{
???????
/**////?<summary>
???????
///?從數(shù)據(jù)庫中取新聞
???????
///?</summary>
???????
///?<returns></returns>

???????public?override??List<News>?getListOfNews()
???????
{
???????????List
<News>?_list?=?new?List<News>();
???????????
//從數(shù)據(jù)庫中取得數(shù)據(jù)填充到_list?中
???????????Console.WriteLine("從數(shù)據(jù)庫中取得數(shù)據(jù)填充到_list?中");
???????????
return?_list;
???????
???????}

????}

?????

??? 3:基于XML讀取新聞:

?????

Code
/**////?<summary>
????????
///?從XML中取新聞
????????
///?</summary>
????????
///?<returns></returns>

????????public?override?List<News>?getListOfNews()
????????
{
????????????List
<News>?_list?=?new?List<News>();
????????????
//從XML中取得數(shù)據(jù)填充到_list?中
????????????Console.WriteLine("從XML中取得數(shù)據(jù)填充到_list?中");
????????????
return?_list;

????????}

????

??? 4:新聞實體類:

?

Code
public??class?News
????
{
???????
/**////?<summary>
???????
///?新聞標題
???????
///?</summary>

???????private?string?_news_title;
???????
public?string?news_title
???????
{
???????????
get?{?return?this._news_title;?}
???????????
set?{?this._news_title?=?value;?}
???????
???????}

???????
/**////?<summary>
???????
///?新聞內(nèi)容
???????
///?</summary>

???????private?string?_news_content;
???????
public?string?news_content
???????
{
???????????
get?{?return?this._news_content;?}
???????????
set?{?this._news_content?=?value;?}

???????}

????}

???

??? 5:下面是抽象裝飾類:

Code
public?abstract?class?Decorator_News?:Component_News?
????
{
????????
/**////?<summary>
????????
///?取新聞
????????
///?</summary>
????????
///?<returns></returns>

???????public?override?List<News>?getListOfNews()
???????
{
???????????
return?this._Component_News.getListOfNews();

???????}

???????
private?Component_News?_Component_News;
???????
public?Decorator_News(Component_News?_Component_News2)
???????
{
???????????
this._Component_News?=?_Component_News2;
???????
???????}


???????
????}

??????

??? 6:擴展新聞組件: 給新聞添加人氣的方法類:

Code
public??class?ConcreteDecortor_AddAmount:Decorator_News?
????
{
???????
public?string????AddAmount()
???????
{
???????????
//新聞人氣加一
???????????Console.WriteLine("新聞人氣已經(jīng)加一");
???????????
return?"新聞人氣已經(jīng)加一";
???????
???????}

???????
public?ConcreteDecortor_AddAmount(Component_News?_Component_News):?base(_Component_News)
???????
{


???????}

???????
/**////?<summary>
???????
///?重寫父類中讀取新聞的方法
???????
///?</summary>
???????
///?<returns></returns>

???????public?override?List<News>?getListOfNews()
???????
{
???????????
//此處加入擴展代碼:新聞人氣加一
???????????AddAmount();
???????????
return??base.getListOfNews();??????????
???????
???????}


????


????}

????

??? 7:擴展新聞組件: 把新聞加入到RSS中的方法類:

Code
public??class?ConcreteDecortor_AddRss?:?Decorator_News?
????
{
???????
/**////?<summary>
???????
///?將新聞標題加入到RSS中
???????
///?</summary>
???????
///?<returns></returns>

???????public?string?AddRss()
???????
{
???????????
//新聞標題已經(jīng)被RSS收錄
???????????Console.WriteLine("新聞標題已經(jīng)加入到RSS中");
???????????
return?"";
???????
???????}

???????
public?ConcreteDecortor_AddRss(Component_News?_Component_News):?base(_Component_News)
???????
{


???????}

???????
/**////?<summary>
???????
///?重寫父類中讀取新聞的方法
???????
///?</summary>
???????
///?<returns></returns>

???????public?override?List<News>?getListOfNews()
???????
{
???????????
//此處加入擴展代碼:將新聞標題加入到RSS中
???????????AddRss();
???????????
return?base.getListOfNews();

???????}

????}

???

??? 8:客戶端調(diào)用:為了說明問題,本人就選用控制臺程序來說明.

Code
static?void?Main(string[]?args)
????????
{
????????????
//數(shù)據(jù)庫方式取新聞
????????????Component_News?_Component_News?=?new?DB_News();
????????????
//擴展了展示新聞標題的同時增加此新聞人氣的方法
????????????Decorator_News?_Decorator_News?=?new?ConcreteDecortor_AddAmount(_Component_News);
????????????
//擴展了展示新聞標題的同時同時將新聞標題加入RSS中的方法
????????????_Decorator_News?=?new?ConcreteDecortor_AddRss(_Decorator_News);
????????????_Decorator_News.getListOfNews();
????????????Console.ReadKey();
????????}

???

??? 9:運行效果:這樣就可以為斷的添加新的裝飾者來裝飾我們的新聞組件了,并不需要修改新聞組件,而只要添加新的類.Decorator模式采用對象組合大大的降低了系統(tǒng)的耦合度。



?
??????裝飾者模式的問題及解決:用裝飾者實例化組件時,將增加代碼的復雜度,一旦應用了裝飾者模式,不只需要實例化組件,還要把組件包裝進裝飾者,而這樣的裝飾者有多少個是不確定的。這里可以應用工廠模式來實例化組件來簡化操作。

???? 注:
??????? 本文參考:<<Head First 設計模式>>

轉(zhuǎn)載于:https://www.cnblogs.com/ASPNET2008/archive/2008/06/15/1222724.html

總結(jié)

以上是生活随笔為你收集整理的老生常谈:装饰者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久成人亚洲 | 天天操婷婷 | 久久嫩草精品久久久久 | 免费在线视频一区二区 | 亚洲免费观看高清完整版在线 | 老湿机69福利区午夜x片 | 天天夜夜爽| 精品久久久久久无码国产 | 成人亚洲综合 | 日韩在线观看av | 亚洲一级二级三级 | 成人免费观看网站 | 少妇毛片一区二区三区 | 椎名由奈av一区二区三区 | 欧美巨大荫蒂茸毛毛人妖 | 免费黄色视屏 | 最新中文字幕在线观看视频 | wwwav在线 | 波多野结衣在线一区二区 | 免费在线观看a视频 | 天天综合亚洲 | 亚洲成人久久久 | 国产高清在线观看 | 牛牛视频在线观看 | 四虎新网址| 亚洲剧情在线 | 久一区二区三区 | 欧美日韩在线观看一区二区 | 日本aa视频| 亚洲欧美日韩国产 | 最好看的日本字幕mv视频大全 | av中出在线 | 美梦视频大全在线观看高清 | 少妇专区| 欧美日韩一区二区三区电影 | 手机在线看永久av片免费 | 美女久久久 | 久久综合色网 | 亚洲精品免费在线视频 | www.日韩| 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 天天操夜夜添 | 日本一区二区在线视频 | 五月婷婷在线观看 | 扒开腿揉捏花蒂h | 国产91免费看| 91视频在线观看视频 | 日日夜夜免费精品视频 | 韩国三级hd中文字幕有哪些 | 国产精品美女久久久久图片 | 欧美另类自拍 | 在线观看中文字幕视频 | 黄色网页入口 | www.国产在线观看 | 午夜视频导航 | 91娇羞白丝 | 天天操天天弄 | 亚洲伦理在线视频 | 96精品 | 自拍视频在线 | 日本欧美亚洲 | 亚洲国产情侣 | 91精品国产一区二区在线观看 | 91精品久久久久久久99蜜桃 | 99热这里是精品 | 日韩福利一区二区三区 | 日韩精品一区二 | 亚洲精品电影 | 国产视频二 | 亚洲国产综合一区 | 国产网红无码精品视频 | 丝袜老师办公室里做好紧好爽 | 超碰888 | 免费在线播放 | 亚洲高清网站 | 日韩性爰视频 | 91午夜理伦私人影院 | 一级片久久 | 日韩在线视频网 | 中文字幕二区三区 | 亚洲作爱 | 青青操在线观看视频 | 毛片啪啪啪 | 噜噜视频 | 丁香六月婷婷激情 | 日本免费高清视频 | 波多野结衣91 | 亚洲男人网站 | 日韩日韩日韩日韩日韩 | 久久精品av | 99在线免费 | 强制高潮抽搐哭叫求饶h | 青青青手机视频在线观看 | 成人免费网视频 | 激情视频亚洲 | 国产午夜麻豆影院在线观看 | 欧美午夜理伦三级在线观看 | 可以免费观看的毛片 | 久久精品无码av |