策略模式

定義:

策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。

使用場景:

1、在實現相同的功能,系統只是根據的不同的業務場景實現的方式方法不一樣,可以通過對象來進行選擇管理需要的實現方法。

2、封裝所有的實現方式,而使用者不用關心具體的實現,把核心的邏輯隱藏起來,在安全上有一點作用

3、通過判斷來執行不同的行爲方法並且很多時,避免了IF的圈複雜性,添加策略維護起來方便

4、有多種行爲方法,在系統中在不同的場景中用到其中的一種。

優點:

1、把相同功能而不同的行爲方法通過類把他們管理起來。

2、避免通過判斷來選擇不同的實現方式

3、把實現邏輯行爲算法按照顆粒度細分。一個業務邏輯涉及到了多種業務行爲方法交叉使用,把他們通過類的方式分離出來,可以按業務需求組裝。

缺點:

1、客戶端使用者需要知道所有的算法才能正確使用

2、把方法轉移成類,這樣會造成很多的類,管理類的難度。因此用不用此模式要看算法的多少進行選擇

下面使用的登錄方式爲例,如下代碼

策略抽象

    public abstract class LoginStrategy
    {
        public LoginRespose LoginRespose { get; set; }

        LoginRequest LoginInfo { get; set; }

        public LoginStrategy(LoginRequest loginRequest)
        {
            LoginInfo = loginRequest;
            LoginRespose = new LoginRespose();
        }

        public abstract bool Login();
    }

策略上下文

 public class LoginContext
    {
        LoginStrategy LoginStrategyBLL { get; set; }

        public LoginContext(LoginStrategy loginStrategy)
        {
            LoginStrategyBLL = loginStrategy;
        }

        public LoginRespose Login()
        {
            LoginStrategyBLL.Login();
            return LoginStrategyBLL.LoginRespose;
        }
    }

郵箱登錄

  public class EmailLoginStrategy : LoginStrategy
    {
        public EmailLoginStrategy(LoginRequest loginRequest)
            : base(loginRequest)
        {

        }
        public override bool Login()
        {
            bool isLogin = false;
            LoginRespose.Message = "郵件登錄失敗";
            LoginRespose.Result = false;
            LoginRespose.MessageCode = "0001";
            return isLogin;
        }
    }

手機登錄

  public class MobileLoginStrategy:LoginStrategy
    {
        public MobileLoginStrategy(LoginRequest loginRequest)
            : base(loginRequest)
        {

        }

        public override bool Login()
        {
            bool isLogin = false;
            LoginRespose.Message = "手機登錄失敗";
            LoginRespose.Result = false;
            LoginRespose.MessageCode = "0002";
            return isLogin;
        }
    }

有戶名登錄

 public class UserNameLoginStrategy:LoginStrategy
    {
        public UserNameLoginStrategy(LoginRequest loginRequest)
            : base(loginRequest)
        {

        }

        public override bool Login()
        {
            bool isLogin = false;
            LoginRespose.Message = "用戶名登錄失敗";
            LoginRespose.Result = false;
            LoginRespose.MessageCode = "0002";
            return isLogin;
        }
    }

請求實體

    public class LoginRequest
    {
        public string LoginName { get; set; }

        public string LoginPassword { get; set; }
    }


返回實體

    public class LoginRespose
    {
        public bool Result { get; set; }

        public string Message { get; set; }

        public string MessageCode { get; set; }
    }

客戶端通過郵箱登錄

        public LoginRespose RunLoginStrategy(LoginRequest loginRequest)
        {
            LoginContext loginContext = new LoginContext(new EmailLoginStrategy(loginRequest));
            LoginRespose loginRespose = loginContext.Login();
            return loginRespose;
        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章