|
一、上篇回顧
上篇我們主要講述了創建型模式中的最后一個模式-原型模式,我們主要講述了原型模式的幾類實現方案,和原型模式的應用的場景和特點,原型模式適合在哪些場景下使用呢?我們先來回顧一下我們上篇講述的3個常用的場景。
1、我們在運行態的時候,動態的創建一個動態類型的對象的時候,可能我們使用原型模式,可以動態的創建指定類型的副本,這無疑是好的選擇,否 則如果通過我們前面講述的幾個創建型模式來實現的話,效率和代價上是非常大的。
2、有的時候我們需要對比一個對象在處理前和處理后進行對象狀態的對比,對比是否處理后對象的狀態是否發生變化,或者是其他的要求。這個時候通過原型模式來克隆對象的副本,遠比通過引入其他的Factory或者abstract Factory 來的有效和更容易實現。
3、如果我們發現有一類這樣的對象,這類對象通常來說比較簡單,并且這類對象之間的差別很有規律,并且這類對象數量一般有限,那么這個時候,我們通過原型模式來做的話,通過一個對象來復制創建其他類型的對象可能比通過引入其他的Factory或者abstract Factory 更容易實現,而且只需要對象本身提供一個Clone()方法即可。
4、有的時候我們的項目中有這樣的情況,我們是在別人的功能的基礎上進行擴展,我們有不能修改現有的程序,如果這個應用程序是基于其他類型的創建型模式,那么如果我們在系統中新增一個類型的時候,我們需要修改統一的創建型模式中的代碼,不管是修改配置文件還是具體的功能代碼,無疑都是要修改的,那么如果我們通過原型模式的話,只需要在新增類型的對象內部,提供一個克隆方法即可,完成新對象的創建。
通過上面的情況,那么我們也能大概看出來原型模式的有一個前提,就是必須是基于對象之上調用Clone()方法完成對象的復制,如果沒有創建這個對象的話,可能不能直接使用該方法。
我們也講述了,對于Clone()對象的時候,深復制和淺復制的情況,還包括通過序列化對象的形式來完成對象的深復制。
二、摘要
本文主要是講述結構型模式中一個比較常用的模式-外觀模式,這個模式呢,有個最大的特點將細粒度的對象包裝成粗粒度的對象,應用程序通訪問這個外觀對象,來完成細粒度對象的調用,外觀模式一般是分布式應用和系統架構中的應用服務層的設計中常用的方式,并且一般結合外觀模式+DTO來完成服務層的設計,提供分布式應用服務的高效服務,外觀模式我們可以這樣理解,我們通過外觀的包裝,使應用程序只能看到外觀對象,而不會看到具體的細節對象,這樣無疑會降低應用程序的復雜度,并且提高了程序的可維護性。本文將會從以下幾個方面進行講述:
1、外觀模式的使用場景和特點
2、外觀模式的實現方案。
3、總結外觀模式。
我們這里先給出一個外觀模式的原理圖:
這是未使用外觀模式之前的情況,下面給出使用外觀模式后的情形:
通過外觀對象來組織細粒度的服務的調用,外觀對象提供給外部應用程序以使用的服務,而具體的調用細粒度的過程則被外觀對象給封裝起來,當然這個過程就是封裝變化的部分,而將變化的部分與應用程序進行隔離,無疑對程
序的易用性和可維護性都是很大的提高。
三、本文大綱
a、上篇回顧。
b、摘要。
c、本文大綱。
d、外觀模式的特點及使用場景。
e、外觀模式的實現方案。
f、外觀模式使用總結。
四、外觀模式的特點及使用場景
外觀模式的主要思想是將復雜的細粒度的對象服務包裝成簡單的易使用的粗粒度的功能服務,我們大家最容易理解和知道的外觀模式就是,使用的API接口的封裝,我們將第三方的API接口引入到我們的項目中的時候,我們需要對這些接口進行包裝,將細粒度的具體調用過程進行包裝成外觀類的形式,通過外觀類來進行統一的調用。我們平時把一些常用的公共方法也可以簡易的稱之為外觀模式,我們將復雜的細粒度的功能,包裝成一個比較通用的簡易的的粗粒度的功能。我們來看看哪些場景下,我們使用外觀模式很適合呢?
1、我們在使用第三方類庫或者API的時候,我們通過本地的API接口的封裝,來完成對第三方API接口的粗粒度外觀對象,通過這個外觀對象可以很容易的完成服務的調用。我們這里舉例說明吧,例如現在我有一個發送手機短信的API接口,是第三方提供給我的API接口,那么我如何包裝呢?下面給出對API封裝的相關代碼和說明:
public class MessageHelper
{
private static readonly MessageHelper instance = new MessageHelper();
#region API接口
[DllImport("EUCPComm.dll", EntryPoint = "SendSMS")] //即時發送
private static extern int SendSMS(string sn, string mn, string ct, string priority);
[DllImport("EUCPComm.dll", EntryPoint = "SendSMSEx")] //即時發送(擴展)
private static extern int SendSMSEx(string sn, string mn, string ct, string addi, string priority);
[DllImport("EUCPComm.dll", EntryPoint = "SendScheSMS")] // 定時發送
private static extern int SendScheSMS(string sn, string mn, string ct, string ti, string priority);
#endregion
#region 對上面的API包裝后的方法
public int SendSMSEx1(string sn, string mn, string ct, string addi, string priority)
{
return SendSMSEx(sn, mn, ct, addi, priority);
}
public int SendSMS1(string sn, string mn, string ct, string priority)
{
return SendSMS(sn, mn, ct, priority);
}
public int SendScheSMS1(string sn, string mn, string ct, string ti, string priority)
{
return SendScheSMS(sn, mn, ct, ti, priority);
}
#endregion
}
it知識庫:系統架構技能之設計模式—外觀模式,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。