设计模式-职责链模式
场景:用户输入账号密码登录,
判断用户名是否正确,密码是否正确,用户名是否过期,用户名是否注销。
//用户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(); }
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。