定義:
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
使用場景:
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;
}