您好,登錄后才能下訂單哦!
場景:用戶輸入賬號密碼登錄,
判斷用戶名是否正確,密碼是否正確,用戶名是否過期,用戶名是否注銷。
//用戶
class User
{
public string name { get; set; }
public string password { get; set; }
public string state { get; set; }
}
abstract class Approve
{
protected User user;
public Approve(User _user)
{
user = _user;
}
protected Approve superStep;
public void SetSuperApprove(Approve Approve)
{
superStep = Approve;
}
abstract public void ApproveRun();
}
class ApproveName : Approve
{
public ApproveName(User _user) : base(_user)
{
}
public override void ApproveRun()
{
if (user.name != "張三")
{
Console.WriteLine("用戶名稱不正確");
}
else
{
if (superStep != null)
{
superStep.ApproveRun();//交給客戶端設定的下個處理者,名稱正確,下面驗證密碼
}
}
}
}
class ApprovePassword : Approve
{
public ApprovePassword(User _user) : base(_user)
{
}
public override void ApproveRun()
{
if (user.password != "123456")
{
Console.WriteLine("用戶密碼不正確");
}
else
{
if (superStep != null)
{
superStep.ApproveRun();//密碼正確,下面驗證狀態
}
}
}
}
class ApproveState : Approve
{
public ApproveState(User _user) : base(_user)
{
}
public override void ApproveRun()
{
if (user.state == "-1")
{
Console.WriteLine("用戶已注銷");
}
else if (user.state == "-2")
{
Console.WriteLine("用戶已過期");
}
else
{
Console.WriteLine("用戶登錄成功");
}
}
}
//前端
static void Main(string[] args)
{
User user = new User();
user.name = "張三1";
user.password = "123456";
user.state = "-1";
Approve stepName = new ApproveName(user);
Approve stepPassword = new ApprovePassword(user);
Approve stepState = new ApproveState(user);
stepName.SetSuperApprove(stepPassword);//客戶設置下一個處理者
stepPassword.SetSuperApprove(stepState);
stepName.ApproveRun();
Console.WriteLine("--------------------------");
Console.ReadLine();
}
總結:職責鏈模式其實就是把if條件抽象成對象,連成一條鏈;提交的請求,按鏈傳遞,如果當前對象能處理就處理不然傳遞給下一個。避免了請求者和處理者的耦合。
優點:靈活,可隨時增加或減少職責,
缺點:客戶端需要清楚業務邏輯,然后把各個對象設置為鏈。
與狀態模式區別:
狀態模式: 當前對象如果不能處理請求,自動轉入下一個對象(提前設定好);有狀態管理類控制狀態對象的執行;客戶端調用簡單,但是如果職責對象擴展的話會違背開閉原則。
if else 改成狀態模式比較好
職責鏈模式:當前對象如果不能處理請求,轉入的下一個對象需要客戶自己設定;客戶端需要知道所有職責對象的權限;客戶端設置繁瑣,但是職責對象靈活度很高。
swicth 改成職責鏈模式比較好
上面例子用狀態實現如下:
class User
{
public string name { get; set; }
public string password { get; set; }
public string state { get; set; }
}
abstract class Approve
{
public User user;
public Approve(User _user)
{
user = _user;
}
abstract public void ApproveRun(Context context);
}
class ApproveName : Approve
{
public ApproveName(User _user) : base(_user)
{
}
public override void ApproveRun(Context context)
{
if (user.name != "張三")
{
Console.WriteLine("用戶名稱不正確");
}
else
{
context.Approve = new ApprovPassword(user);//交給下個對象處理,驗證密碼
}
}
}
class ApprovPassword : Approve
{
public ApprovPassword(User _user) : base(_user)
{
}
public override void ApproveRun(Context context)
{
if (user.password != "123456")
{
Console.WriteLine("用戶密碼不正確");
}
else
{
context.Approve = new ApprovState(user);
}
}
}
class ApprovState : Approve
{
public ApprovState(User _user) : base(_user)
{
}
public override void ApproveRun(Context context)
{
if (user.state == "-1")
{
Console.WriteLine("用戶已過期");
}
else if (user.state == "-2")
{
Console.WriteLine("用戶已注銷");
}
else
{
Console.WriteLine("用戶登錄成功。");
}
}
}
static void Main(string[] args)
{
User user = new User();
user.name = "張三";
user.password = "123456";
user.state = "-1";
Approve stepName = new ApproveName(user);
Context context = new Context(stepName);
context.ApproveRun();
Console.ReadLine();
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。