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