|
一、上篇回顧
我們上篇主要講述了結(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)勢,也不是一句二句就能表述清楚的,還是我們來看看圖形的可視化的描述吧。
我們這里設(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í)。
通過上圖,我們知道了,組合對象可以看作是一系列簡單的對象組合成負(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è)例子來說明吧,可能更直觀。
這里我們可以理解為一個(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è)方法。我還是給出圖來說話吧:
包含上面的這些元素,那么我們可以通過一些相應(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)系我們修改或刪除,多謝。