出于我的理解目的,我已经实现了责任链模式。
//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
事件可以在事件args中传递客户。
例子
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
,您是否考虑过使用HelpDeskFactory
来返回通用接口(interface),例如IHelpDesk
。听起来您也可以在此特定示例中使用“策略模式”。