For my understanding purpose i have implemented Chain-Of-Responsibility pattern.
//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);
}
Question
Without breaking the chain-of-responsibility ,how can i apply delegates and events to rewrite the code?
C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...
In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.
What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.
C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.
If I understand you correctly...what you could do is remove the SetupHandler
method and introduce an OnElevateQuery
event were your CriticalHelpDesk
object could handle the FrontLineHelpDesk.OnElevateQuery
event and your LegalHelpDesk
object could handle the CriticalHelpDesk.OnElevateQuery
event. The OnElevateQuery
event could pass the customer in the event args.
Example
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");
}
}
}
Usage
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);
However, as the query type is based on the enum ComplaintType
have you considered using perhaps a HelpDeskFactory
which could return a generic interface e.g. IHelpDesk
. Sounds like you could also use the Strategy Pattern for this particular example.
Customer having a complaintType looks like a misplaced attribute. I assume you mean a Complaint has a Type.
I may be wrong in which case you can point what behavior is missing This just looks like an event to me. Each event handler would be called in order of subscription. Each handler is free to ignore the notification based on the complaint. The next handler is called as long as the Handled property of the eventArgs is false and there are pending subscribers.
class ComplaintSource
{
public delegate void ComplaintHandler(Complaint complaint, HandledEventArgs evtArgs);
public event ComplaintHandler NewComplaint;
// code that raises the NewComplaint event as appropriate.
public void DoStuffThatRaisesTheEvent()
{
var evtArgs = new HandledEventArgs();
var theComplaint = new Complaint();
if (null == this.NewComplaint)
return;
Delegate[] list = NewComplaint.GetInvocationList();
foreach (Delegate del in list)
{
if (evtArgs.Handled)
break;
ComplaintHandler handler = (ComplaintHandler)del;
handler(theComplaint, evtArgs);
}
}
}
class FrontLineServiceDesk
{
FrontLineServiceDesk(ComplaintSource source)
{ source.NewComplaint += HandleGeneralComplaint; }
void HandleGeneralComplaint(Complaint complaint, HandledEventArgs evtArgs) { ...
// set evtArgs.Handled = true if you've handled the complaint
// this will stop the chain
}
}
class CriticalIssueServiceDesk
{
CriticalIssueServiceDesk(ComplaintSource source)
{ source.NewComplaint += HandleGeneralComplaint; }
void HandleCriticalComplaint(Complaint complaint, HandledEventArgs evtArgs) { ... }
}
// finally set the ball in motion
var source = new CompaintSource();
var frontLineDesk = new FrontLineServiceDesk(source);
var criticalIssueDesk = new CriticalIssueServiceDesk(source);
source.DoStuffThatRaisesTheEvent();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With