1:主題拆解
①基本介紹
②多個微服務呼叫實作下單
③外觀模式的優缺點
④適用場景
⑤應用實體
2:基本介紹
外觀模式:外部與一個子系統的通信通過一個統一的外觀角色進行,為子系統中的一組介面提供一個一致的入口,
外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用,
外觀模式又叫門面模式,是一種物件結構型模式,

3:多個微服務呼叫實作下單
我司系統基于各個功能模塊采用微服務的方式,整體實作了一套下單交易系統,現在模擬下單的各個環節,
1:基本版
①物流微服務
public interface ILogisticsSystem
{
bool CheckLogistics(int productId, int cityId);
void Newlogistics(int productId, int cityId);
}
public class LogisticsSystem:ILogisticsSystem
{
public bool CheckLogistics(int productId, int cityId)
{
return true;
}
public void Newlogistics(int productId, int cityId)
{
Console.WriteLine("商品[{0}]在城市[{1}]發貨", productId,cityId);
}
}
②倉庫微服務
public interface IStorageSystem
{
bool CheckStorage(int productId);
}
public class StorageSystem:IStorageSystem
{
public bool CheckStorage(int productId)
{
return true;
}
}
③訂單微服務
public interface IOrderSystem
{
bool CheckOrder(int userId, int productId);
void NewOrder(int userId, int productId);
}
public class OrderSystem : IOrderSystem
{
public bool CheckOrder(int userId, int productId)
{
return true;
}
public void NewOrder(int userId, int productId)
{
Console.WriteLine("{0}給商品{1}下訂單", userId, productId);
}
}
④用戶微服務
public interface IUserSystem
{
bool CheckUser(int id);
}
public class UserSystem : IUserSystem
{
public bool CheckUser(int id)
{
return id > 100;
}
}
⑤上端呼叫
IUserSystem userSystem = new UserSystem();
IStorageSystem storageSystem = new StorageSystem();
ILogisticsSystem logisticsSystem = new LogisticsSystem();
IOrderSystem orderSystem = new OrderSystem();
if (!userSystem.CheckUser(userId))
{
Console.WriteLine("用戶檢測不通過");
}
else if (!storageSystem.CheckStorage(productId))
{
Console.WriteLine("庫存檢測不通過");
}
else if (!logisticsSystem.CheckLogistics(productId, cityId))
{
Console.WriteLine("物流檢測不通過");
}
else if (!orderSystem.CheckOrder(userId, productId))
{
Console.WriteLine("訂單檢測不通過");
}
else
{
orderSystem.NewOrder(userId,productId);
logisticsSystem.Newlogistics(productId,cityId);
}
分析:至此我們上端就實作了下單的功能,下訂單流程:檢查用戶-->檢查庫存-->檢查物流-->檢測訂單-->下訂單-->增加物流訂單,
我們可以看出上端處理程式結構比較復雜,多個子系統,上端使用成本很高,對子系統的依賴很強,再增加一個子系統,需要調整原有的邏輯,即不方便也不穩定,
2:中間層
沒有什么技術問題是包一層不能解決的,如果有則再包一層,
①添加一個門面類
public class FacadeCenter
{
IUserSystem userSystem = new UserSystem();
IStorageSystem storageSystem = new StorageSystem();
ILogisticsSystem logisticsSystem = new LogisticsSystem();
IOrderSystem orderSystem = new OrderSystem();
public void CheckNewOrder(int userId, int productId, int cityId)
{
if (!userSystem.CheckUser(userId))
{
Console.WriteLine("用戶檢測不通過");
}
else if (!storageSystem.CheckStorage(productId))
{
Console.WriteLine("庫存檢測不通過");
}
else if (!logisticsSystem.CheckLogistics(productId, cityId))
{
Console.WriteLine("物流檢測不通過");
}
else if (!orderSystem.CheckOrder(userId, productId))
{
Console.WriteLine("訂單檢測不通過");
}
else
{
orderSystem.NewOrder(userId, productId);
logisticsSystem.Newlogistics(productId, cityId);
}
}
}
②上端呼叫
FacadeCenter facaderCenter = new FacadeCenter();
facaderCenter.CheckNewOrder(userId,productId,cityId);
分析:上端使用變簡單了,沒有使用成本了,上端也變成的穩定,即使要調整邏輯關系也是在中間層中進行,對上端呼叫與下端的微服務沒有任何改動,不過我們發現實際上矛盾沒有消失,只是轉移了,由上端轉移到了中間層,
3:面向介面
基于面向介面編程的思想以及物件復用,我們可以將上面的中間層進行優化,
①中間層
public class FacadeCenter: IFacadeCenter
{
private static IUserSystem userSystem = new UserSystem();
private static IStorageSystem storageSystem = new StorageSystem();
private static ILogisticsSystem logisticsSystem = new LogisticsSystem();
private static IOrderSystem orderSystem = new OrderSystem();
public void CheckNewOrder(int userId, int productId, int cityId)
{
if (!userSystem.CheckUser(userId))
{
Console.WriteLine("用戶檢測不通過");
}
else if (!storageSystem.CheckStorage(productId))
{
Console.WriteLine("庫存檢測不通過");
}
else if (!logisticsSystem.CheckLogistics(productId, cityId))
{
Console.WriteLine("物流檢測不通過");
}
else if (!orderSystem.CheckOrder(userId, productId))
{
Console.WriteLine("訂單檢測不通過");
}
else
{
orderSystem.NewOrder(userId, productId);
logisticsSystem.Newlogistics(productId, cityId);
}
}
}
②介面層
public interface IFacadeCenter
{
void CheckNewOrder(int userId, int productId, int cityId);
}
③上端的呼叫
IFacadeCenter facaderCenter = new FacadeCenter();
facaderCenter.CheckNewOrder(userId,productId,cityId);
分析:此時已經采用面向介面編程的方式實作了系統的調整,
如果此時有新微服務加入,即添加了一個財務服務,系統如何體現出擴展性,
4:依賴注入
①引入財務微服務
public class FinanceSystem : IFinanceSystem
{
public bool CheckFinance(int userid)
{
return true;
}
}
public interface IFinanceSystem
{
bool CheckFinance(int userid);
}
②添加財務門面實作,繼承介面
public class FacadeCenteFinance:IFacadeCenter
{
private static IUserSystem userSystem = new UserSystem();
private static IStorageSystem storageSystem = new StorageSystem();
private static ILogisticsSystem logisticsSystem = new LogisticsSystem();
private static IOrderSystem orderSystem = new OrderSystem();
private static IFinanceSystem financeSystem = new FinanceSystem();
public void CheckNewOrder(int userId, int productId, int cityId)
{
if (!userSystem.CheckUser(userId))
{
Console.WriteLine("用戶檢測不通過");
}
else if (!storageSystem.CheckStorage(productId))
{
Console.WriteLine("庫存檢測不通過");
}
else if (!logisticsSystem.CheckLogistics(productId, cityId))
{
Console.WriteLine("物流檢測不通過");
}
else if (!orderSystem.CheckOrder(userId, productId))
{
Console.WriteLine("訂單檢測不通過");
}
else if (!financeSystem.CheckFinance(userId))
{
Console.WriteLine("財務檢測不通過");
}
else
{
orderSystem.NewOrder(userId, productId);
logisticsSystem.Newlogistics(productId, cityId);
}
}
}
③上端的呼叫
IFacadeCenter facaderCenter = new FacadeCenteFinance();
facaderCenter.CheckNewOrder(userId, productId, cityId);
分析:在不更改原中間層實作邏輯的情況下,直接擴展新的功能,即滿足了對修改關閉對擴展開發的原則,增加了程式的健壯性,
從版本3到版本4,我們引入依賴注入的方式,采用組態檔指定IFacadeCenter介面對應的實作類,這樣上端代碼可以不用修改,只能添加新的羅就,就能夠實作新功能的擴展,
4:外觀模式的優缺點
1:優點
簡化處理:對客戶端屏蔽了子系統組件,減少了客戶端所需處理的物件數目并使得子系統使用起來更加容易,引入外觀模式后客戶端代碼將簡化,
松耦合:實作了子系統于客戶端之間松耦合關系,使得子系統的變化不會影響到客戶端,只需修改外觀類,
子系統修改靈活:一個子系統的修改對其他子系統沒有影響,而且子系統內部變化也不會影響外觀物件,
唯一入口:只提供了一個訪問子系統的唯一入口,但不會影響客戶端直接使用子系統類,
2:缺點
不能限制客戶端使用子系統:外觀模式不能很好地限制客戶端直接使用子系統,如果客戶端對訪問子系統做太多的限制就會減少可變性與靈活性,
可能需要修改外觀類:如果設計不當,增加新的子系統可能需要外觀類,違背OCP,
5:適用場景
為一個復雜的模塊或子系統提供一個外界訪問的介面,
子系統相對獨立,外界對子系統的訪問只要黑箱操作即可,
預防低水平人員帶來的風險擴散,層次化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯系,而通過外觀類建立聯系,降低層之間的耦合度,
6:應用實體
迪米特法則的體現
分層,單一職責的體現
三層架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300447.html
標籤:其他
上一篇:計算機網路面經之TCP協議(一)
