日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人拍拍拍 | 亚洲AV无码国产精品播放在线 | 激情四射av | 玖玖在线资源 | 国产精品传媒一区二区 | av色在线 | 日韩中文在线播放 | 欧美99| 欧美成人精品欧美一 | 国产精品福利在线播放 | 69视频在线| 国产激情91| 欧美碰碰碰 | 欧美极品aaaaabbbbb | 午夜免费福利网站 | 性xxxx另类xxⅹ | 女人看黄色网 | 国产精品自拍电影 | 色老二导航 | 精品肉丝脚一区二区三区 | 中文字幕av有码 | 欧美偷拍视频 | 高潮毛片无遮挡免费看 | 天天操天天摸天天干 | 男人的天堂在线 | 在线免费一区 | 久久午夜免费视频 | 婷婷视频在线观看 | 黄色网址网站 | 精品国产一区二区三区久久久久久 | 午夜视频免费观看 | 天天尻| 成人深夜电影 | 神马久久久久久久久久 | 黄色网址av | 久久久久久久久久99 | 亲吻刺激视频 | 色七七久久 | 草碰在线 | 国产精品香蕉国产 | 国产日韩精品视频 | 日韩欧美国产另类 | 成人毛片基地 | 久久九 | 欧美一区二区三区婷婷 | 成人永久视频 | 成人黄色在线观看视频 | 电影91久久久 | 99热都是精品 | 欧美一区二区三区免费看 | 美女扒开腿让男人操 | 欧美精品亚洲精品日韩精品 | 久久网一区二区 | 欧美日韩在线视频一区二区三区 | av男人天堂av | 肉丝美脚视频一区二区 | 久久国产成人精品av | 性色在线观看 | 亚洲黄在线观看 | 日本乱大交xxxx公交车 | 91精品国产91综合久久蜜臀 | 69精品一区二区三区 | www.成人av.com | 伊人久久大香线蕉综合网站 | 最近中文字幕av | 国产精品.com | 欧洲亚洲激情 | 日本色视 | 欧美放荡性医生videos | 免费荫蒂添的好舒服视频 | 18久久久| 久久久久久亚洲中文字幕无码 | 亚洲av久久久噜噜噜熟女软件 | 老色驴综合网 | 日日操日日爽 | 国产在线精品一区二区三区 | 男女啪啪软件 | 成人片在线看 | 在线看片一区二区 | 色翁荡息又大又硬又粗又爽 | www黄色com| 精品无码一区二区三区爱欲 | 鲁一鲁一鲁一鲁一av | 性色在线 | 卡一卡二视频 | 欧美天堂在线观看 | 亚洲人成人 | 午夜影院在线观看 | 五月婷婷俺也去 | 一级在线看 | 国产主播一区二区三区 | 亚洲人成色777777精品音频 | 777欧美 | 神马午夜51 | 亚洲视频一区二区三区四区 | 欧美天堂在线 | 嫩草懂你 | 欧美不卡在线观看 | 国产精品毛片一区二区 |