成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從理發(fā)店流程抽象設(shè)計(jì)模式中的組合模式

開(kāi)發(fā) 架構(gòu)
理發(fā)店的會(huì)員卡很多人都辦理過(guò),那他們這種總店加分店的模式該如何抽象化成軟件開(kāi)發(fā)語(yǔ)言呢?我們可以借用組合模式來(lái)解決。

  今天下班客廳的燈確實(shí)亮堂了許多,照照鏡子感覺(jué)自己一下蒼老許多,看來(lái)還是燈光暗比較好,看不出來(lái)自己的憔悴啊,哈哈,其實(shí)還是頭發(fā)長(zhǎng)了,決定出去剪發(fā)。

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

  到家后稍微有點(diǎn)后悔,我竟然一時(shí)沖動(dòng)花了那么多錢(qián)辦了張剪發(fā)的會(huì)員卡,不過(guò)辦也辦了,只好自己安慰安慰自己,心想,辦了卡可以打折上折,而且那么多分店想去哪家去哪家,頓時(shí)心情好為能好一點(diǎn)了,突然間想到了一個(gè)模式,跟現(xiàn)在的場(chǎng)景很合適,名字叫《組合模式》,為什么說(shuō)跟組合模式很相似呢?

  先看看組合模式的定義吧,在《大話(huà)設(shè)計(jì)模式一書(shū)中》組合模式的定義為:“將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示‘部分-整體’的層次結(jié)構(gòu)。組合模式使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

  那就拿我剪發(fā)辦卡的事情來(lái)分析一下吧。

  首先,一張卡可以在總部,分店,加盟店使用,那么總部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,這個(gè)屬性結(jié)構(gòu)的店面層級(jí)關(guān)系就明確啦。

  那么,總店刷卡消費(fèi)與分店刷卡消費(fèi)是一樣的道理,那么總店與分店對(duì)會(huì)員卡的使用也具有一致性。

  1.組合模式的例子

  組合模式結(jié)構(gòu)圖:

那么組合模式的實(shí)例如下:

  //抽象的部件類(lèi)描述將來(lái)所有部件共有的行為

  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();

  }

  //組合部件類(lèi)

  public class Leaf : Component

  {

  //葉子節(jié)點(diǎn)不具備添加的能力,所以不實(shí)現(xiàn)

  public override void Add(Component component)

  {

  throw new NotImplementedException();

  }

  //葉子節(jié)點(diǎn)不具備添加的能力必然也不能刪除

  public override void Remove(Component component)

  {

  throw new NotImplementedException();

  }

  //葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)所以顯示自己的執(zhí)行結(jié)果

  public override void eachChild()

  {

  Console.WriteLine("{0}執(zhí)行了..",name);

  }

  }

  //組合類(lèi)

  public class Composite : Component

  {

  //用來(lái)保存組合的部件

  List<Component> myList = new List<Component>();

  //添加節(jié)點(diǎn) 添加部件

  public override void Add(Component component)

  {

  myList.Add(component);

  }

  //刪除節(jié)點(diǎn) 刪除部件

  public override void Remove(Component component)

  {

  myList.Remove(component);

  }

  //遍歷子節(jié)點(diǎn)

  public override void eachChild()

  {

  Console.WriteLine("{0}執(zhí)行了..", name);

  foreach (Component c in myList)

  {

  c.eachChild();

  }

  }

  }

  static void Main(string[] args)

  {

  //構(gòu)造根節(jié)點(diǎn)

  Composite rootComponent = new Composite();

  rootComponent.Name = "根節(jié)點(diǎn)"

  //添加兩個(gè)葉子幾點(diǎn),也就是子部件

  Leaf l = new Leaf();

  l.Name = "葉子節(jié)點(diǎn)一"

  Leaf l1 = new Leaf();

  l1.Name = "葉子節(jié)點(diǎn)二"

  rootComponent.Add(l);

  rootComponent.Add(l1);

  //遍歷組合部件

  rootComponent.eachChild();

  }

  運(yùn)行結(jié)果如下:

2.應(yīng)用組合模式的會(huì)員卡消費(fèi)

  那么我們就根據(jù)我們會(huì)員卡的消費(fèi),來(lái)模擬一下組合模式的實(shí)現(xiàn)吧!let's go!

  首先:

  1.我們的部件有,總店,分店,加盟店!

  2.我們的部件共有的行為是:刷會(huì)員卡

  3.部件之間的層次關(guān)系,也就是店面的層次關(guān)系是,總店下有分店、分店下可以擁有加盟店。

  有了我們這幾個(gè)必要條件后,我的要求就是目前店面搞活動(dòng)當(dāng)我在總店刷卡后,就可以累積相當(dāng)于在所有下級(jí)店面刷卡的積分總額,設(shè)計(jì)的代碼如下:

  /// <summary> /// 店面類(lèi) 抽象出來(lái)的店面部件

  /// </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

  {

  //構(gòu)造函數(shù)

  public StoreOrBranch() { }

  public StoreOrBranch(string storeName)

  {

  this.storeName = storeName;

  }

  List<Storefront> myStoreList = new List<Storefront>();

  //刷卡消費(fèi)

  public override void PayByCard()

  {

  Console.WriteLine("店面{0}的積分已累加進(jìn)該會(huì)員卡", 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

  {

  //構(gòu)造函數(shù)

  public JoinInStore() { }

  public JoinInStore(string storeName)

  {

  this.storeName = storeName;

  }

  //刷卡消費(fèi)

  public override void PayByCard()

  {

  Console.WriteLine("店面{0}的積分已累加進(jìn)該會(huì)員卡", 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("朝陽(yáng)總店");

  StoreOrBranch brach = new StoreOrBranch("東城分店");

  JoinInStore jstore = new JoinInStore("海淀加盟店一");

  JoinInStore jstore1 = new JoinInStore("上地加盟店二");

  brach.Add(jstore);

  brach.Add(jstore1);

  store.Add(brach);

  store.PayByCard();

  }

  運(yùn)行結(jié)果如下:

  這樣在累積所有子店面積分的時(shí)候,就不需要去關(guān)心子店面的個(gè)數(shù)了,也不用關(guān)系是否是葉子節(jié)點(diǎn)還是組合節(jié)點(diǎn)了,也就是說(shuō)不管是總店刷卡,還是加盟店刷卡,都可以正確有效的計(jì)算出活動(dòng)積分。

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

  引用大話(huà)設(shè)計(jì)模式的片段:“當(dāng)發(fā)現(xiàn)需求中是體現(xiàn)部分與整體層次結(jié)構(gòu)時(shí),以及你希望用戶(hù)可以忽略組合對(duì)象與單個(gè)對(duì)象的不同,統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí),就應(yīng)該考慮組合模式了。”

原文鏈接:http://www.cnblogs.com/doubleliang/archive/2011/12/27/2304104.html

【編輯推薦】

  1. Java I/O系統(tǒng)基礎(chǔ)知識(shí)
  2. Java 遠(yuǎn)程文件對(duì)接
  3. Java生成樹(shù)結(jié)構(gòu)各點(diǎn)之間最短路徑算法
  4. Java字符編碼根本原理
  5. Java中對(duì)象的等價(jià)性比較

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2013-11-26 15:48:53

Android設(shè)計(jì)模式SDK

2021-04-19 21:25:48

設(shè)計(jì)模式到元

2021-03-06 22:50:58

設(shè)計(jì)模式抽象

2021-09-16 06:44:05

組合模式設(shè)計(jì)

2020-12-17 09:38:16

設(shè)計(jì)模式參數(shù)

2024-09-14 08:24:44

設(shè)計(jì)模式抽象工廠模式JDK

2011-07-28 09:50:58

設(shè)計(jì)模式

2012-04-12 09:38:21

JavaScript

2012-08-30 09:07:33

設(shè)計(jì)模式

2009-01-15 10:55:29

JavaScript設(shè)計(jì)模式抽象工廠

2024-07-31 08:12:33

2021-04-18 21:07:32

門(mén)面模式設(shè)計(jì)

2024-06-19 16:02:46

2023-08-07 06:30:15

抽象工廠模式軟件設(shè)計(jì)模式

2010-01-21 09:08:53

.NET設(shè)計(jì)模式

2021-04-14 09:02:22

模式 設(shè)計(jì)建造者

2019-04-24 09:43:46

代碼開(kāi)發(fā)工具

2021-03-10 08:20:54

設(shè)計(jì)模式OkHttp
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久免费在线观看 | 男人天堂99 | 丁香综合 | 99视频在线免费观看 | 欧美一级黄 | 欧美日在线 | 久久国产精品一区 | 狠狠操狠狠 | 免费日本视频 | 欧美一级片 | 91麻豆精品国产91久久久久久 | 国产精品国产精品国产专区不卡 | 成年视频在线观看 | 人人人人干 | 亚洲一级淫片 | 精品国产青草久久久久96 | 成人福利网| 99精品在线 | 精品国产精品国产偷麻豆 | 性一交一乱一透一a级 | 亚洲精品国产成人 | 日韩一区在线观看视频 | 欧美日韩a | 久久亚洲欧美日韩精品专区 | 欧美涩涩网 | 国产精品18久久久久久白浆动漫 | 免费在线观看一区二区三区 | 日本在线一二 | 日韩一区二区在线视频 | 婷婷综合在线 | 久久久久国产一区二区 | 久久久精品一区 | 啪啪av| 亚洲精品乱码久久久久久久久久 | av一级久久 | 国产成人在线一区 | 男女在线免费观看 | 成年人在线视频 | h视频在线观看免费 | 亚洲午夜精品一区二区三区他趣 | 成人国产在线视频 |