一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

系統(tǒng)架構(gòu)技能之設(shè)計(jì)模式—組合模式

  一、上篇回顧

      我們上篇主要講述了結(jié)構(gòu)型模式中的外觀模式,外觀模式作為結(jié)構(gòu)型模式中的一個(gè)簡單又實(shí)用的模式,外觀模式通過封裝細(xì)節(jié)來提供大粒度的調(diào)用,直接的好處就是,封裝細(xì)節(jié),提供了應(yīng)用寫程序的可維護(hù)性和易用性。外觀模式一般應(yīng)用在系統(tǒng)架構(gòu)的服務(wù)層中,當(dāng)我們是多個(gè)不同類型的客戶端應(yīng)用程序時(shí),比如一個(gè)系統(tǒng)既可以在通過Web的形式訪問,也可以通過客戶端應(yīng)用程序的形式時(shí),可能通過外觀模式來提供遠(yuǎn)程服務(wù),讓應(yīng)用程序進(jìn)行遠(yuǎn)程調(diào)用,這樣通過外觀形式提供服務(wù),那么不管是什么樣的客戶端都訪問一致的外觀服務(wù),那么以后就算是我們的應(yīng)用服務(wù)發(fā)生變化,那么我們不需要修改沒一個(gè)客戶端應(yīng)用的調(diào)用,只需要修改相應(yīng)的外觀應(yīng)用即可。

  我們主要是講述了以下的幾種情況,使用外觀模式可能更適合:

  1、我們在使用第三方類庫或者API的時(shí)候,我們通過本地的API接口的封裝,來完成對第三方API接口的粗粒度外觀對象,通過這個(gè)外觀對象可以很容易的完成服務(wù)的調(diào)用。

  2、我們在架構(gòu)設(shè)計(jì)的過程中,一次的功能訪問可能需要同時(shí)的調(diào)用很多個(gè)對象,那么如果我們在服務(wù)調(diào)用的時(shí)候,能夠在應(yīng)用程序調(diào)用中一次就能完成所有要同時(shí)調(diào)用的對象那該多好啊,外觀模式無疑是最好的原則,特別是在分布式應(yīng)用中,通過遠(yuǎn)程調(diào)用服務(wù),通過外觀模式降低應(yīng)用程序與服務(wù)的交互次數(shù),同時(shí)可以降低應(yīng)用程序的復(fù)雜性。

  二、摘要

  本文將會講述結(jié)構(gòu)性模式中的另外一個(gè)常用的模式-組合模式,我們平時(shí)在面向?qū)ο蟮脑O(shè)計(jì)中,我想有一個(gè)原則經(jīng)常被提及就是,我們在設(shè)計(jì)的時(shí)候,對象組合>類的繼承,本篇將會將結(jié)合簡單的實(shí)例來說明這方面的優(yōu)勢,并且完成對組合模式的主題思想的掌握。我們這樣來簡單的理解組合模式,組合模式就是把一些現(xiàn)有的對象或者元素,經(jīng)過組合后組成新的對象,新的對象提供內(nèi)部方法,可以讓我們很方便的完成這些元素或者內(nèi)部對象的訪問和操作。我們也可以把組合對象理解成一個(gè)容器,容器提供各種訪問其內(nèi)部對象或者元素的API,我們只需要使用這些方法就可以操作它了。那么對象組合相比繼承的優(yōu)勢有哪些呢?可能具體的優(yōu)勢,也不是一句二句就能表述清楚的,還是我們來看看圖形的可視化的描述吧。

clip_image002  我們這里設(shè)計(jì)的是持久化服務(wù)寫到一個(gè)基類中,然后繼承自該基類的子類都會擁有內(nèi)置的持久化方法,可能后續(xù)我們又要添加其他的針對某個(gè)具體的對象類,有一些個(gè)性化的服務(wù),我們通過擴(kuò)展這個(gè)類,進(jìn)行繼承,這樣多重繼承后,會有一個(gè)很大的問題。子類膨脹的問題,而且一般來說繼承的重?cái)?shù)達(dá)到5層左右的時(shí)候,性能上可能就會有一定的瓶頸。也不是好的設(shè)計(jì)的思路。這時(shí)候?qū)ο蠼M合可能為我們提供了更好的解決方案。基于組合方式的話,可能我們可以這樣來做,換個(gè)思路:就像我們的一個(gè)負(fù)責(zé)的對象,可以通過簡單的對象來組成的道理差不多,其實(shí)。

clip_image004  通過上圖,我們知道了,組合對象可以看作是一系列簡單的對象組合成負(fù)責(zé)的對象的一個(gè)模式,復(fù)雜對象可以看作是簡單對象的一個(gè)容器。這個(gè)復(fù)雜對象完成了簡單對象的封裝,通過這個(gè)容器完成對象內(nèi)部簡單對象的訪問。

  三、本文大綱

       a、上篇回顧。

       b、摘要。

       c、本文大綱。

       d、組合模式的特點(diǎn)及使用場景。

       e、組合模式的經(jīng)典實(shí)現(xiàn)。

       f、組合模式的其他方案。

       g、原型模式使用總結(jié)。

  四、組合模式的特點(diǎn)及使用場景

  組合模式是將一系列對象組合成樹形結(jié)構(gòu)用來表示整體和部分之間的關(guān)系,組合模式的主要目的是達(dá)到,訪問組合對象和訪問單個(gè)對象具有一致性。這里的組合對象比較特殊,本身他可以是由其他的對象組合而成,同時(shí),這個(gè)組合對象又可以是組成更復(fù)雜對象的一個(gè)部分。我們來舉個(gè)例子來說明吧,可能更直觀。

clip_image006  這里我們可以理解為一個(gè)簡單的查詢組件可能有要滿足上述的幾類查詢條件的輸入類型,將這個(gè)組件作為一個(gè)容器,那么同事,這個(gè)容器又可以作為另外一個(gè)容器的組件來運(yùn)行,那么我們又可以在分頁控件中,將這個(gè)查詢組件包含到其中。以為分頁提供相應(yīng)的查詢元素的集成。

  我們一般在如下場景中使用組合模式比較方便:

  1、我們有的時(shí)候想用戶使用一個(gè)復(fù)雜對象像使用簡單對象一樣的方式去訪問,并且用戶同意使用對象內(nèi)部的所有的對象時(shí),我們可以考慮使用該模式。這個(gè)怎么理解呢?我們使用復(fù)雜對象像使用簡單對象一樣的方式去訪問的話,那么我們可以使用組合對象,我們把這些簡單的對象進(jìn)行組合,用組合對象進(jìn)行包裝,并且提供相應(yīng)的操作組合對象內(nèi)部的方法。結(jié)合上圖中的例子,我們可以這樣理解,我們把查詢組件封裝成一個(gè)用戶控件,然后可以在其他的頁面中進(jìn)行調(diào)用。這個(gè)時(shí)候,我們可能考慮如何分部頁面,如何能夠動(dòng)態(tài)的維護(hù)界面上的控件,是否顯示,控件里面顯示的文本和值是什么?等等,這些都是我們可以考慮的元素,那么我們?nèi)绾蝸碜瞿兀刻峁┫旅娴膸讉€(gè)方法。我還是給出圖來說話吧:

clip_image008  包含上面的這些元素,那么我們可以通過一些相應(yīng)的方法來進(jìn)行訪問內(nèi)部的元素。我們給出簡單的示例代碼:

public QueryControl()
{
InitializeComponent();

this.InitControlList();
}

public event EventHandler handler;

private Dictionary<string,Control> _controlList = null;
/// <summary>
/// 初始化控件信息
/// </summary>
private void InitControlList()
{
this._controlList = new Dictionary<string,Control>();
}
/// <summary>
/// 返回界面控件中所有的查詢條件控件列表
/// </summary>
/// <returns></returns>
public Dictionary<string,Control> GetControls()
{
return this._controlList;
}

/// <summary>
/// 添加查詢控件到界面中
/// </summary>
/// <param name="control"></param>
/// <returns></returns>
public bool AddControl(string key,Control control)
{
if(this._controlList.ContainsKey(key))
return false;
this._controlList.Add(key,control);

return true;
}

/// <summary>
/// 移除指定鍵值的對象
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool RemoveControl(string key)
{
if (this._controlList.ContainsKey(key))
return false;
this._controlList.Remove(key);

return true;
}

public virtual void OnQuery()
{
if (this.handler != null)
handler(
this, new EventArgs());
}

public void Query(object sender, EventArgs e)
{
this.CreateSQL();
this.OnQuery();
}

/// <summary>
/// 根據(jù)選中的條件生成SQL語句
/// </summary>
private void CreateSQL()
{
throw new NotImplementedException();
}

it知識庫系統(tǒng)架構(gòu)技能之設(shè)計(jì)模式—組合模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产乱子伦一区二区三区 | 在线播影院理论片 | 五月婷婷俺来也 | 福利精品一区 | 日本在线观看一级高清片 | 国产一区曰韩二区欧美三区 | 韩国一级毛片在线高清免费 | 美国一级做a爰片性色毛片 美国一区二区三区 | 久久精品中文字幕一区 | 最新国产成人综合在线观看 | 91精品福利在线 | 美女视频黄的全免费视频网站 | 好吊日免费视频 | 久久久不卡国产精品一区二区 | 国产精品第二页 | 国产在线观看91精品一区 | 亚洲香蕉伊综合在人在线 | 国产亚洲精品俞拍视频 | 开心久久激情 | 欧美人成在线视频 | 午夜免费视频观看 | 日本xxxⅹ色视频在线观看网站 | 91区国产福利在线观看午夜 | 日韩午夜精品 | 99久久99久久 | 91福利精品老师国产自产在线 | 欧美人人做人人爽人人喊 | 日日摸人人看97人人澡 | 精品日韩一区二区三区 | 亚洲国产欧美另类 | 1024cc香蕉视频 | 婷婷四房综合激情五月在线 | 亚洲 欧美 国产另类首页 | 激情五月婷婷在线 | 最新亚洲情黄在线网站 | 午夜爽爽性刺激一区二区视频 | 性视频小说 | 国产自在线观看 | 亚洲一区二区中文字5566 | 国产免费观看视频 | 久久青青草原热精品 |