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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式系列-组合模式

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

????? 今天下班客廳的燈確實亮堂了許多,照照鏡子感覺自己一下蒼老許多,看來還是燈光暗比較好,看不出來自己的憔悴啊,哈哈,其實還是頭發長了,決定出去剪發。

?????? 進到美發店,便有熱情的服務生招呼,顯示洗頭,挑選造型師,開始剪發,剪發中被造型師推薦了各種各樣的收費項目,我只選擇了一樣軟化頭發。完畢之后,看了下單子哇塞、好貴噢,不過造型師給我剪的發型我還是很喜歡的,我決定以后還找他剪,但是又太貴,無奈中,發型師向我推薦了他們的會員卡,全場所有項目均5折,最近因為圣誕節還在搞活動這期間辦卡的可享受折上折8.6,我心想那這下就太劃算了,而且他們總店,分店都可以用,所以毫不猶豫的辦了張會員卡。。。囧。。。。

?????? 到家后稍微有點后悔,我竟然一時沖動花了那么多錢辦了張剪發的會員卡,不過辦也辦了,只好自己安慰安慰自己,心想,辦了卡可以打折上折,而且那么多分店想去哪家去哪家,頓時心情好為能好一點了,突然間想到了一個模式,跟現在的場景很合適,名字叫《組合模式》,為什么說跟組合模式很相似呢?

?????? 先看看組合模式的定義吧,在《大話設計模式一書中》組合模式的定義為:“將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

?????? 那就拿我剪發辦卡的事情來分析一下吧。

?????? 首先,一張卡可以在總部,分店,×××店使用,那么總部可以刷卡,分店也可以刷卡,×××店也可以刷卡,這個屬性結構的店面層級關系就明確啦。

?????? 那么,總店刷卡消費與分店刷卡消費是一樣的道理,那么總店與分店對會員卡的使用也具有一致性。

??????1.組合模式的例子

????????組合模式結構圖:

??????? 那么組合模式的實例如下:

  • //抽象的部件類描述將來所有部件共有的行為 ?
  • ????public?abstract?class?Component ?
  • ????{ ?
  • ????????protected?string?name; ?
  • ????????public?string?Name ?
  • ????????{ ?
  • ????????????get?
  • ????????????{ ?
  • ????????????????return?name; ?
  • ????????????} ?
  • ????????????set?
  • ????????????{ ?
  • ????????????????name?=?value; ?
  • ????????????} ?
  • ????????} ?
  • ????????//添加部件 ?
  • ????????public?abstract?void?Add(Component?component); ?
  • ????????//刪除部件 ?
  • ????????public?abstract?void?Remove(Component?component); ?
  • ????????//遍歷所有子部件 ?
  • ????????public?abstract?void?eachChild(); ?
  • ????} ?
  • ?
  • ????//組合部件類 ?
  • ????public?class?Leaf?:?Component ?
  • ????{ ?
  • ????????//葉子節點不具備添加的能力,所以不實現 ?
  • ????????public?override?void?Add(Component?component) ?
  • ????????{ ?
  • ????????????throw?new?NotImplementedException(); ?
  • ????????} ?
  • ?
  • ????????//葉子節點不具備添加的能力必然也不能刪除 ?
  • ????????public?override?void?Remove(Component?component) ?
  • ????????{ ?
  • ????????????throw?new?NotImplementedException(); ?
  • ????????} ?
  • ?
  • ????????//葉子節點沒有子節點所以顯示自己的執行結果 ?
  • ????????public?override?void?eachChild() ?
  • ????????{ ?
  • ????????????Console.WriteLine("{0}執行了..",name); ?
  • ????????} ?
  • ????} ?
  • ?
  • ????//組合類 ?
  • ????public?class?Composite?:?Component ?
  • ????{ ?
  • ????????//用來保存組合的部件 ?
  • ????????List<Component>?myList?=?new?List<Component>(); ?
  • ?
  • ????????//添加節點?添加部件 ?
  • ????????public?override?void?Add(Component?component) ?
  • ????????{ ?
  • ????????????myList.Add(component); ?
  • ????????} ?
  • ?
  • ????????//刪除節點?刪除部件 ?
  • ????????public?override?void?Remove(Component?component) ?
  • ????????{ ?
  • ????????????myList.Remove(component); ?
  • ????????} ?
  • ?
  • ????????//遍歷子節點 ?
  • ????????public?override?void?eachChild() ?
  • ????????{ ?
  • ????????????Console.WriteLine("{0}執行了..",?name); ?
  • ????????????foreach?(Component?c?in?myList) ?
  • ????????????{ ?
  • ????????????????c.eachChild(); ?
  • ????????????} ?
  • ????????} ?
  • ????} ?
  • ????static?void?Main(string[]?args) ?
  • ????{ ?
  • ????????????//構造根節點 ?
  • ????????????Composite?rootComponent?=?new?Composite(); ?
  • ????????????rootComponent.Name?=?"根節點"; ?
  • ?
  • ????????????//添加兩個葉子幾點,也就是子部件 ?
  • ????????????Leaf?l?=?new?Leaf(); ?
  • ????????????l.Name?=?"葉子節點一"; ?
  • ????????????Leaf?l1?=?new?Leaf(); ?
  • ????????????l1.Name?=?"葉子節點二"; ?
  • ?
  • ????????????rootComponent.Add(l); ?
  • ????????????rootComponent.Add(l1); ?
  • ?
  • ????????????//遍歷組合部件 ?
  • ????????????rootComponent.eachChild(); ?
  • ?????}?
  • ??????? 運行結果如下:

    ?????

    ????? 2.應用組合模式的會員卡消費

    ??????? 那么我們就根據我們會員卡的消費,來模擬一下組合模式的實現吧!let's go!

    ??????? 首先:

    ?????????????? 1.我們的部件有,總店,分店,×××店!

    ?????????????? 2.我們的部件共有的行為是:刷會員卡

    ?????????????? 3.部件之間的層次關系,也就是店面的層次關系是,總店下有分店、分店下可以擁有×××店。

    ????????有了我們這幾個必要條件后,我的要求就是目前店面搞活動當我在總店刷卡后,就可以累積相當于在所有下級店面刷卡的積分總額,設計的代碼如下:

  • ///?<summary> ?
  • ????///?店面類?抽象出來的店面部件 ?
  • ????///?</summary> ?
  • ????public?abstract?class?Storefront ?
  • ????{ ?
  • ????????//店名 ?
  • ????????protected?string?storeName?=?string.Empty; ?
  • ????????public?string?StoreName ?
  • ????????{ ?
  • ????????????get?
  • ????????????{ ?
  • ????????????????return?storeName; ?
  • ????????????} ?
  • ????????} ?
  • ?
  • ????????//添加店面 ?
  • ????????public?abstract?void?Add(Storefront?store); ?
  • ????????//刪除店面 ?
  • ????????public?abstract?void?Remove(Storefront?store); ?
  • ?
  • ????????//定義所有部件公用的行為?刷卡行為 ?
  • ????????public?abstract?void?PayByCard(); ?
  • ????} ?
  • ?
  • ????public?class?StoreOrBranch?:?Storefront ?
  • ????{ ?
  • ????????//構造函數 ?
  • ????????public?StoreOrBranch()?{?} ?
  • ????????public?StoreOrBranch(string?storeName) ?
  • ????????{ ?
  • ????????????this.storeName?=?storeName; ?
  • ????????} ?
  • ????????List<Storefront>?myStoreList?=?new?List<Storefront>(); ?
  • ????????//刷卡消費 ?
  • ????????public?override?void?PayByCard() ?
  • ????????{ ?
  • ????????????Console.WriteLine("店面{0}的積分已累加進該會員卡",?storeName); ?
  • ????????????foreach?(Storefront?sf?in?myStoreList) ?
  • ????????????{ ?
  • ????????????????sf.PayByCard(); ?
  • ????????????} ?
  • ????????} ?
  • ?
  • ????????//增加店面 ?
  • ????????public?override?void?Add(Storefront?store) ?
  • ????????{ ?
  • ????????????myStoreList.Add(store); ?
  • ????????} ?
  • ?
  • ????????//解除店面 ?
  • ????????public?override?void?Remove(Storefront?store) ?
  • ????????{ ?
  • ????????????myStoreList.Remove(store); ?
  • ????????} ?
  • ????} ?
  • ?
  • ????public?class?JoinInStore?:?Storefront ?
  • ????{ ?
  • ????????//構造函數 ?
  • ????????public?JoinInStore()?{?} ?
  • ????????public?JoinInStore(string?storeName) ?
  • ????????{ ?
  • ????????????this.storeName?=?storeName; ?
  • ????????} ?
  • ????????//刷卡消費 ?
  • ????????public?override?void?PayByCard() ?
  • ????????{ ?
  • ????????????Console.WriteLine("店面{0}的積分已累加進該會員卡",?storeName); ?
  • ????????} ?
  • ?
  • ????????public?override?void?Add(Storefront?store) ?
  • ????????{ ?
  • ????????????throw?new?NotImplementedException(); ?
  • ????????} ?
  • ?
  • ????????public?override?void?Remove(Storefront?store) ?
  • ????????{ ?
  • ????????????throw?new?NotImplementedException(); ?
  • ????????} ?
  • ????} ?
  • ?
  • ???static?void?Main(string[]?args) ?
  • ???{ ?
  • ????????????StoreOrBranch?store?=?new?StoreOrBranch("朝陽總店"); ?
  • ????????????StoreOrBranch?brach?=?new?StoreOrBranch("東城分店"); ?
  • ????????????JoinInStore?jstore?=?new?JoinInStore("海淀×××店一"); ?
  • ????????????JoinInStore?jstore1?=?new?JoinInStore("上地×××店二"); ?
  • ?
  • ????????????brach.Add(jstore); ?
  • ????????????brach.Add(jstore1); ?
  • ????????????store.Add(brach); ?
  • ?
  • ????????????store.PayByCard(); ?
  • ????} ?
  • 運行結果如下:

    ??????

    ?????? 這樣在累積所有子店面積分的時候,就不需要去關心子店面的個數了,也不用關系是否是葉子節點還是組合節點了,也就是說不管是總店刷卡,還是×××店刷卡,都可以正確有效的計算出活動積分。

    ????? 3.什么情況下使用組合模式

    ?????? 引用大話設計模式的片段:“當發現需求中是體現部分與整體層次結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了。”

    轉載于:https://blog.51cto.com/wangboyang/752433

    總結

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

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