gpt4 book ai didi

C# 与委托(delegate)的责任链

转载 作者:太空狗 更新时间:2023-10-29 21:11:11 24 4
gpt4 key购买 nike

为了我的理解目的,我已经实现了责任链模式。

//Abstract Base Type

public abstract class CustomerServiceDesk
{
protected CustomerServiceDesk _nextHandler;
public abstract void ServeCustomers(Customer _customer);
public void SetupHadler(CustomerServiceDesk _nextHandler)
{
this._nextHandler = _nextHandler;
}
}

public class FrontLineServiceDesk:CustomerServiceDesk
{
public override void ServeCustomers(Customer _customer)
{
if (_customer.ComplaintType == ComplaintType.General)
{
Console.WriteLine(_customer.Name + " Complaints are registered ;
will be served soon by FrontLine Help Desk..");
}

else
{
Console.WriteLine(_customer.Name + "
is redirected to Critical Help Desk");

_nextHandler.ServeCustomers(_customer);
}

}
}
public class CriticalIssueServiceDesk:CustomerServiceDesk
{
public override void ServeCustomers(Customer _customer)
{
if (_customer.ComplaintType == ComplaintType.Critical)
{
Console.WriteLine(_customer.Name +
"Complaints are registered ; will be served soon
by Critical Help Desk");
}
else if (_customer.ComplaintType == ComplaintType.Legal)
{
Console.WriteLine(_customer.Name +
"is redirected to Legal Help Desk");
_nextHandler.ServeCustomers(_customer);
}
}
}

public class LegalissueServiceDesk :CustomerServiceDesk
{
public override void ServeCustomers(Customer _customer)
{
if (_customer.ComplaintType == ComplaintType.Legal)
{
Console.WriteLine(_customer.Name +
"Complaints are registered ;
will be served soon by legal help desk");
}
}
}


public class Customer
{
public string Name { get; set; }
public ComplaintType ComplaintType { get; set; }
}


public enum ComplaintType
{
General,
Critical,
Legal
}

void Main()
{
CustomerServiceDesk _frontLineDesk = new FrontLineServiceDesk();
CustomerServiceDesk _criticalSupportDesk = new CriticalIssueServiceDesk();
CustomerServiceDesk _legalSupportDesk = new LegalissueServiceDesk();
_frontLineDesk.SetupHadler(_criticalSupportDesk);
_criticalSupportDesk.SetupHadler(_legalSupportDesk);

Customer _customer1 = new Customer();
_customer1.Name = "Microsoft";
_customer1.ComplaintType = ComplaintType.General;

Customer _customer2 = new Customer();
_customer2.Name = "SunSystems";
_customer2.ComplaintType = ComplaintType.Critical;

Customer _customer3 = new Customer();
_customer3.Name = "HP";
_customer3.ComplaintType = ComplaintType.Legal;

_frontLineDesk.ServeCustomers(_customer1);
_frontLineDesk.ServeCustomers(_customer2);
_frontLineDesk.ServeCustomers(_customer3);
}

问题

在不破坏责任链的情况下,我如何应用委托(delegate)和事件来重写代码?

最佳答案

如果我理解正确...您可以做的是删除 SetupHandler 方法并引入 OnElevateQuery 事件是您的 CriticalHelpDesk 对象可以处理 FrontLineHelpDesk.OnElevateQuery 事件,您的 LegalHelpDesk 对象可以处理 CriticalHelpDesk.OnElevateQuery 事件。 OnElevateQuery 事件可以在事件参数中传递客户。

例子

public abstract class CustomerServiceDesk
{
public delegate void ElevateQueryEventHandler(Customer c);
public event ElevateQueryEventHandler OnElevateQuery;
public abstract void ServeCustomer(Customer c);
}

public class FrontLineServiceDesk : CustomerServiceDesk
{
public override void ServeCustomer(Customer c)
{
switch (c.ComplaintType)
{
case ComplaintType.General:
Console.WriteLine(c.Name + " Complaints are registered; will be served soon by FrontLine Help Desk");
break;
default:
OnElevateQuery(c);
}
}
}

public class CriticalIssueServiceDesk : CustomerServiceDesk
{
public override void ServeCustomer(Customer c)
{
switch (c.ComplaintType)
{
case ComplaintType.Critical:
Console.WriteLine(c.Name + " Complaints are registered; will be served soon by Critical Help Desk");
break;
case ComplaintType.Legal:
OnElevateQuery(c);
break;
default:
Console.WriteLine("Unable to find appropriate help desk for your complaint.");
break;
}
}
}

public class LegalIssueServiceDesk : CustomerServiceDesk
{
public override void ServeCustomer(Customer c)
{
if (c.CompliantType == CompliantType.Legal)
{
Console.WriteLine(c.Name + " Complaints are registered; will be served soon by Legal Help Desk");
}
else
{
// you could even hook up the FrontLine.ServeCustomer event
// to the OnElevateQuery event of this one so it takes the
// query back to the start of the chain (if it accidently ended up here).
Console.WriteLine("Wrong department");
}
}
}

用法

CustomerServiceDesk _frontLine = new FrontLineServiceDesk();
CustomerServiceDesk _criticalLine = new CriticalLineServiceDesk();
CustomerServiceDesk _legalLine = new LegalLineServiceDesk();
// hook up events
_frontLine.OnElevateQuery += _critialLine.ServeCustomer;
_criticalLine.OnElevateQuery += _legalLine.ServeCustomer;

Customer _customer1 = new Customer();
_customer1.Name = "Microsoft";
_customer1.ComplaintType = ComplaintType.General;

Customer _customer2 = new Customer();
_customer2.Name = "SunSystems";
_customer2.ComplaintType = ComplaintType.Critical;

Customer _customer3 = new Customer();
_customer3.Name = "HP";
_customer3.ComplaintType = ComplaintType.Legal;

_frontLine.ServeCustomer(_customer1);
_frontLine.ServeCustomer(_customer2);
_frontLine.ServeCustomer(_customer3);

但是,由于查询类型基于枚举 ComplaintType,您是否考虑过使用可能返回通用接口(interface)的 HelpDeskFactory,例如IHelpDesk。听起来您也可以针对此特定示例使用 Strategy Pattern

关于C# 与委托(delegate)的责任链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com