场景:用户输入账号密码登录,
判断用户名是否正确,密码是否正确,用户名是否过期,用户名是否注销。
10余年建站经验, 成都网站设计、网站建设、外贸网站建设客户的见证与正确选择。创新互联建站提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。
//用户
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();
}