|
一、上篇回顧
我們上篇主要講述了結(jié)構(gòu)型模式中的外觀模式,外觀模式作為結(jié)構(gòu)型模式中的一個(gè)簡(jiǎn)單又實(shí)用的模式,外觀模式通過(guò)封裝細(xì)節(jié)來(lái)提供大粒度的調(diào)用,直接的好處就是,封裝細(xì)節(jié),提供了應(yīng)用寫(xiě)程序的可維護(hù)性和易用性。外觀模式一般應(yīng)用在系統(tǒng)架構(gòu)的服務(wù)層中,當(dāng)我們是多個(gè)不同類型的客戶端應(yīng)用程序時(shí),比如一個(gè)系統(tǒng)既可以在通過(guò)Web的形式訪問(wèn),也可以通過(guò)客戶端應(yīng)用程序的形式時(shí),可能通過(guò)外觀模式來(lái)提供遠(yuǎn)程服務(wù),讓應(yīng)用程序進(jìn)行遠(yuǎn)程調(diào)用,這樣通過(guò)外觀形式提供服務(wù),那么不管是什么樣的客戶端都訪問(wèn)一致的外觀服務(wù),那么以后就算是我們的應(yīng)用服務(wù)發(fā)生變化,那么我們不需要修改沒(méi)一個(gè)客戶端應(yīng)用的調(diào)用,只需要修改相應(yīng)的外觀應(yīng)用即可。
我們主要是講述了以下的幾種情況,使用外觀模式可能更適合:
1、我們?cè)谑褂玫谌筋悗?kù)或者API的時(shí)候,我們通過(guò)本地的API接口的封裝,來(lái)完成對(duì)第三方API接口的粗粒度外觀對(duì)象,通過(guò)這個(gè)外觀對(duì)象可以很容易的完成服務(wù)的調(diào)用。
2、我們?cè)诩軜?gòu)設(shè)計(jì)的過(guò)程中,一次的功能訪問(wèn)可能需要同時(shí)的調(diào)用很多個(gè)對(duì)象,那么如果我們?cè)诜?wù)調(diào)用的時(shí)候,能夠在應(yīng)用程序調(diào)用中一次就能完成所有要同時(shí)調(diào)用的對(duì)象那該多好啊,外觀模式無(wú)疑是最好的原則,特別是在分布式應(yīng)用中,通過(guò)遠(yuǎn)程調(diào)用服務(wù),通過(guò)外觀模式降低應(yīng)用程序與服務(wù)的交互次數(shù),同時(shí)可以降低應(yīng)用程序的復(fù)雜性。
二、摘要
本文將會(huì)講述結(jié)構(gòu)性模式中的另外一個(gè)常用的模式-組合模式,我們平時(shí)在面向?qū)ο蟮脑O(shè)計(jì)中,我想有一個(gè)原則經(jīng)常被提及就是,我們?cè)谠O(shè)計(jì)的時(shí)候,對(duì)象組合>類的繼承,本篇將會(huì)將結(jié)合簡(jiǎn)單的實(shí)例來(lái)說(shuō)明這方面的優(yōu)勢(shì),并且完成對(duì)組合模式的主題思想的掌握。我們這樣來(lái)簡(jiǎn)單的理解組合模式,組合模式就是把一些現(xiàn)有的對(duì)象或者元素,經(jīng)過(guò)組合后組成新的對(duì)象,新的對(duì)象提供內(nèi)部方法,可以讓我們很方便的完成這些元素或者內(nèi)部對(duì)象的訪問(wèn)和操作。我們也可以把組合對(duì)象理解成一個(gè)容器,容器提供各種訪問(wèn)其內(nèi)部對(duì)象或者元素的API,我們只需要使用這些方法就可以操作它了。那么對(duì)象組合相比繼承的優(yōu)勢(shì)有哪些呢?可能具體的優(yōu)勢(shì),也不是一句二句就能表述清楚的,還是我們來(lái)看看圖形的可視化的描述吧。
我們這里設(shè)計(jì)的是持久化服務(wù)寫(xiě)到一個(gè)基類中,然后繼承自該基類的子類都會(huì)擁有內(nèi)置的持久化方法,可能后續(xù)我們又要添加其他的針對(duì)某個(gè)具體的對(duì)象類,有一些個(gè)性化的服務(wù),我們通過(guò)擴(kuò)展這個(gè)類,進(jìn)行繼承,這樣多重繼承后,會(huì)有一個(gè)很大的問(wèn)題。子類膨脹的問(wèn)題,而且一般來(lái)說(shuō)繼承的重?cái)?shù)達(dá)到5層左右的時(shí)候,性能上可能就會(huì)有一定的瓶頸。也不是好的設(shè)計(jì)的思路。這時(shí)候?qū)ο蠼M合可能為我們提供了更好的解決方案。基于組合方式的話,可能我們可以這樣來(lái)做,換個(gè)思路:就像我們的一個(gè)負(fù)責(zé)的對(duì)象,可以通過(guò)簡(jiǎn)單的對(duì)象來(lái)組成的道理差不多,其實(shí)。
通過(guò)上圖,我們知道了,組合對(duì)象可以看作是一系列簡(jiǎn)單的對(duì)象組合成負(fù)責(zé)的對(duì)象的一個(gè)模式,復(fù)雜對(duì)象可以看作是簡(jiǎn)單對(duì)象的一個(gè)容器。這個(gè)復(fù)雜對(duì)象完成了簡(jiǎn)單對(duì)象的封裝,通過(guò)這個(gè)容器完成對(duì)象內(nèi)部簡(jiǎn)單對(duì)象的訪問(wèn)。
三、本文大綱
a、上篇回顧。
b、摘要。
c、本文大綱。
d、組合模式的特點(diǎn)及使用場(chǎng)景。
e、組合模式的經(jīng)典實(shí)現(xiàn)。
f、組合模式的其他方案。
g、原型模式使用總結(jié)。
四、組合模式的特點(diǎn)及使用場(chǎng)景
組合模式是將一系列對(duì)象組合成樹(shù)形結(jié)構(gòu)用來(lái)表示整體和部分之間的關(guān)系,組合模式的主要目的是達(dá)到,訪問(wèn)組合對(duì)象和訪問(wèn)單個(gè)對(duì)象具有一致性。這里的組合對(duì)象比較特殊,本身他可以是由其他的對(duì)象組合而成,同時(shí),這個(gè)組合對(duì)象又可以是組成更復(fù)雜對(duì)象的一個(gè)部分。我們來(lái)舉個(gè)例子來(lái)說(shuō)明吧,可能更直觀。
這里我們可以理解為一個(gè)簡(jiǎn)單的查詢組件可能有要滿足上述的幾類查詢條件的輸入類型,將這個(gè)組件作為一個(gè)容器,那么同事,這個(gè)容器又可以作為另外一個(gè)容器的組件來(lái)運(yùn)行,那么我們又可以在分頁(yè)控件中,將這個(gè)查詢組件包含到其中。以為分頁(yè)提供相應(yīng)的查詢?cè)氐募伞?/p>
我們一般在如下場(chǎng)景中使用組合模式比較方便:
1、我們有的時(shí)候想用戶使用一個(gè)復(fù)雜對(duì)象像使用簡(jiǎn)單對(duì)象一樣的方式去訪問(wèn),并且用戶同意使用對(duì)象內(nèi)部的所有的對(duì)象時(shí),我們可以考慮使用該模式。這個(gè)怎么理解呢?我們使用復(fù)雜對(duì)象像使用簡(jiǎn)單對(duì)象一樣的方式去訪問(wèn)的話,那么我們可以使用組合對(duì)象,我們把這些簡(jiǎn)單的對(duì)象進(jìn)行組合,用組合對(duì)象進(jìn)行包裝,并且提供相應(yīng)的操作組合對(duì)象內(nèi)部的方法。結(jié)合上圖中的例子,我們可以這樣理解,我們把查詢組件封裝成一個(gè)用戶控件,然后可以在其他的頁(yè)面中進(jìn)行調(diào)用。這個(gè)時(shí)候,我們可能考慮如何分部頁(yè)面,如何能夠動(dòng)態(tài)的維護(hù)界面上的控件,是否顯示,控件里面顯示的文本和值是什么?等等,這些都是我們可以考慮的元素,那么我們?nèi)绾蝸?lái)做呢?提供下面的幾個(gè)方法。我還是給出圖來(lái)說(shuō)話吧:
包含上面的這些元素,那么我們可以通過(guò)一些相應(yīng)的方法來(lái)進(jìn)行訪問(wèn)內(nèi)部的元素。我們給出簡(jiǎn)單的示例代碼:
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>
/// 移除指定鍵值的對(duì)象
/// </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語(yǔ)句
/// </summary>
private void CreateSQL()
{
throw new NotImplementedException();
}
it知識(shí)庫(kù):系統(tǒng)架構(gòu)技能之設(shè)計(jì)模式—組合模式,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。