一区二区久久-一区二区三区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)系我們修改或刪除,多謝。

主站蜘蛛池模板: 韩国在线观看一区二区三区 | 国产免费黄色大片 | 精品一区二区三区免费站 | 天堂成人精品视频在线观 | 婷婷在线观看视频 | 91福利在线免费观看 | 欧美精品第一页 | 久久国产精品夜色 | 亚洲三级色| 久久免费视频2 | 欧美另类xxxx图片 | 久久中文网 | 亚洲六月丁香婷婷综合 | 欧美综合图片 | 男女一级毛片免费播放 | 黄色在线免费看 | 亚洲国产精品久久久久网站 | 91亚洲欧美综合高清在线 | 五月婷婷中文 | 婷婷网五月天天综合天天爱 | 人人干在线 | www日本视频| 午夜看片网址 | 久久老色鬼天天综合网观看 | 国产成人久久蜜一区二区 | 国产综合在线观看视频 | 日本波多野结衣在线 | 午夜大片网| 黄色在线免费观看网址 | 色爱综合网| 国产三级欧美 | 久久大香香蕉国产免费网站 | 天天综合网在线 | 国内精品免费久久久久妲己 | 91啦国产 | 美女毛片在线观看 | 一二三四视频社区5在线高清视频 | 欧美一卡2卡3卡4卡无卡网老狼 | 伊人久综合 | 国产成人精品日本亚洲直接 | 91欧美精品综合在线观看 |