ProxyPattern代理模式(二)

前言:

大家在寫程式時一定常常遇到要寫日誌,權限驗證....等等和主要邏輯不相干的事情

如果把上述這些動作寫在核心邏輯,會讓原有的程式碼變得雜亂

AOP(面向切面编程)可以有效的幫助我們解決上面問題,降低模塊間耦合度,理念來自於代理模式...

這次我們要把上一篇 ProxyPattern代理模式(一) 程式碼重構一下

我們先理解業務在哪邊,業務在下面紅框的部分 Console.log只是記錄此次驗證的資料

我們可以主要邏輯提取動作來做一個簽章


在我心中 介面代表能力,抽象類別代表這一類事物

 因為在此次需求驗證是一種能力,所以我提出來成一個介面

public interface ISubject
{
    bool IsAuth(UserModel user);
}

有兩個類別 LogicProxyService和Logicservice都實現 ISubject 
因為不管是代理類別和被代理類別都擁有檢核能力

 

我們就可將主要邏輯寫在Logicservice 

public class Logicservice : ISubject
{
    MockUserData userList = new MockUserData();

    public bool IsAuth(UserModel user)
    {
        return userList.GetAllUser()
                .Any(o => user.UserName == o.UserName && user.Password == o.Password);
    }
}

 

這邊我使用依賴注入的建構子注入,讓外界決定要注入哪個類別(需繼承ISubject)
可增加未來擴展性和移植性

 撰寫日誌寫在LogicProxyService

public class LogicProxyService : ISubject
{
    private ISubject _realSubjcet;
    public LogicProxyService(ISubject sub)
    {
        _realSubjcet = sub;
    }

    public bool IsAuth(UserModel user)
    {
        Console.WriteLine($"使用者登入:帳號={user.UserName} 密碼={user.Password}");
        return _realSubjcet.IsAuth(user);
    }
}

 

在外界只需這樣使用

  1. 傳入被代理物件
  2. 使用代理物件呼叫方法
#region StaticProxy
var testUser = new UserModel() { Password = "1234", RowID = 1, UserName = "test" };
LogicProxyService staticProxy = new LogicProxyService(new Logicservice());
staticProxy.IsAuth(testUser); 
#endregion

 

SourceCode

總結:

這樣程式碼就比上一篇乾淨許多了! 寫日誌的程式碼和主要邏輯分離開來

靜態代理最主要是將核心邏輯和非核心邏輯分割開來,讓程式碼保持乾淨

 

但靜態代理還是有個缺點,如我們需要擴充100個代理方法 我需要撰寫100代理類別

實在有夠累....

但別擔心在下章會介紹[動態代理模式]來解決此問題

 


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^