1. Introduktion

I den här artikeln kommer vi att se vad som är en "Multicast-delegat" och hur vi skapar och använder den. Multicast-delegater är kombinationen av två eller flera delegater av samma typ och de bildar tillsammans en delegatkedja . Varje deltagare i delegatkedjan bör ha en ogiltig returtyp.

I koden tar vi ett exempel på ett orderbehandlingssystem som använder Multicast-delegaten. Först skapar vi OrderShipment Class och sedan flyttar vi till klientkoden. I klientkoden använder vi vår OrderShipment Class och Multicast Delegate.

2. OrderShipment Class

Denna klass delar upp orderbehandlingen i en liten grupp funktioner. Dessutom kommer alla dessa funktioner att matcha en viss delegatyp. Detta gör att dessa funktioner är berättigade till delegatkedjning.

1) För det första förklarar vi en enkel delegat. Senare kommer vi att använda detta för syftet med delegeringskedjan. Delegaten accepterar order-id och kund-id som en parameter. Dessutom ger det ingenting. Kom ihåg att multicast-delegatprincipen fungerar bara för ogiltiga returtyper. Det finns ingen begränsning på parametrarna den får. Nedan visas delegatdeklarationen:

 // 001: OrderShipment klass. Behandlar ordern // placerad av kundernas offentliga klass OrderShipment {// 001_1: Förklara Multi-cast delegat. // Observera att returtypen ska vara ogiltig offentlig delegerad ogiltig OrderProcessingMethods (int OrderId, int CustomerId); 

2) Vi delade orderbehandlingen i fem små funktioner. Vi kommer att göra dessa funktioner för att bilda Delegate Chaining. Funktionerna visas nedan:

 // 001_2: Implementera orderbearbetningen // Funktioner // Bearbetningsfunktion 1 public void GetShoppingCartItems (int OrderId, int CustomerId) {Console.WriteLine ("(1) GetShoppingCartItems"); Console.WriteLine ("==================" + "============="); Console.WriteLine ("Alla varukorgsobjekt" + "samlas in."); Console.WriteLine ("Bildade en order med" + "levererad Orderid"); Console.WriteLine ("_____________________" + "_____________________________________" + "_____________"); } // Bearbetningsfunktion 2 public void CalculOrderPrice (int OrderId, int Customerid) {Console.WriteLine ("(2) CalculOrderPrice"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Pris för varje produkt" + "samlat in från shopping" + "summerad vagn"); Console.WriteLine ("Orderpris beräknat"); Console.WriteLine ("______________________" + "___________________________________" + "______________"); } // Bearbetningsfunktion 3 public void CalculDiscount (int OrderId, int Customerid) {Console.WriteLine ("(3) CalculDiscount"); Console.WriteLine ("======================" + "========="); Console.WriteLine ("Få rabattbeloppet" + "för VIP"); Console.WriteLine ("Minska orderpriset"); Console.WriteLine ("____________________" + "___________________________________" + "________________"); } // Bearbetningsfunktion 4 public void AwordFreeGifts (int OrderId, int Customerid) {Console.WriteLine ("(4) AwordFreeGifts"); Console.WriteLine ("======================" + "========="); Console.WriteLine ("Vanlig kund. Välj" + "upp en gåva"); Console.WriteLine ("Placera presentföremålet" + "i beställningen gratis"); Console.WriteLine ("_____________________" + "________________________________" + "__________________"); } // Bearbetningsfunktion 5 public void GetOrderConfirmation (int OrderId, int Customerid) {Console.WriteLine ("(5) GetOrderConfirmation"); Console.WriteLine ("======================" + "========="); Console.WriteLine ("Beställningsbekräftelse" + "skärmen visas för användaren"); Console.WriteLine ("Beställning bekräftad"); Console.WriteLine ( ""); } 

Observera att i dessa funktioner finns det inget annat än utropet till konsolen. Men vi ser uppenbarligen hur dessa funktioner kommer att vara i verkliga applikationer.

3) Denna klass har en medlemsfunktion som accepterar Multicast-delegaten som en parameter och sedan ringer till den. Klienten skapar delegatkedjan baserad på ovanstående fem funktioner och kallar sedan denna medlemsfunktion:

 // 001_3: Tar en multicase delegat och // utför affärslogik public void ProcessOrderShipment (OrderProcessingMethods ProcessToFollow, int Orderid, int Customerid) {ProcessToFollow (Orderid, Customerid); } 

Vi slutförde implementeringen av denna klass. Nu ska vi gå till delegerade kedjor.

3. Klientkod - delegerad kedja

Klienten kommer att behandla beställningssändningen annorlunda för tre typer av kunder. Kundtyperna är:

  1. Normala kunder.
  2. Vanliga kunder som gör inköp varje månad två gånger eller mer.
  3. VIP-kunden som har byggt upp en bra relation.

För normal kund finns det ingen rabatt och överraskande presenter. Den vanliga kunden kommer att ha överraskande presenter baserade på orderkostnaden. Och VIP-kunder har både rabatt och gåvor. Låt oss nu gå igenom hur klientkoden använder Multicast-delegaterna.

1) Först skapar vi förekomsten av OrderShipment Class. Koden är nedan:

 // Client 001: Create Orderhipment Object OrderShipment deliverorders = new OrderShipment (); 

2) Därefter förklarar vi en delegat av typen OrderProcessingMethods. Senare kommer vi att använda denna delegerade variabel som en multicast-delegat.

 // Kund 002: Förklara delegaten. // Vi kommer att använda det som Multicast-delegat OrderShipment.OrderProcessingMethods orderprocess; 

3) Därefter skapar vi fem delegerade instanser och de pekar på en av de fem metoderna som implementeras av OrderShipment-klassen.

 // Client 003: Create Delegate Instances OrderShipment.OrderProcessingMethods process1 = new OrderShipment.OrderProcessingMethods (leveransorder.GetShoppingCartItems); OrderShipment.OrderProcessingMethods process2 = new OrderShipment.OrderProcessingMethods (leveransorder. BeräknaOrderPrice); OrderShipment.OrderProcessingMethods process3 = new OrderShipment.OrderProcessingMethods (leveransorder. Beräkna rabatt); OrderShipment.OrderProcessingMethods process4 = new OrderShipment.OrderProcessingMethods (leveransorder.AwordFreeGifts); OrderShipment.OrderProcessingMethods process5 = new OrderShipment.OrderProcessingMethods (leveransorder.GetOrderConfirmation); 

4) Innan behandlingen av beställningen för normal kund bildas en delegerad kedja genom att lägga till den delegerade skapade i föregående steg. När de enskilda delegaterna har kombinerats med + -operatören lagrar vi resultatet i orderprocessdelegatet. Nu har orderprocessdelegatet kedjan av delegater som vi kallar Multicast-delegat. Vi skickar det här delegerade tåget till OrderShipment-gruppmedlemfunktionen ProcessOrderShipment. När vi kallar denna funktion åberopar delegaten alla funktioner som för närvarande är i kedjan. Så för den vanliga kunden vill vi inte ge en gåva och / eller rabatter. Följaktligen är dessa motsvarande funktioner inte en del av delegatkedjan. Observera också att de kedjade funktionerna kallas i samma ordning som de läggs till i kedjan. Funktionens kedja visas nedan

Delegatkedja |

Koden vi skriver för att bilda denna kedja är nedan:

 // Client 004: Processorder för normal kund. // Beställnings-id: 1000. Kund-id 1000. Konsol.WriteLine ("----------------------" + "--------- --------------------------------- "+" ------------- " ); Console.WriteLine ("Process Normal Customer"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); // Observera att du kan använda + = operator också orderprocess = process1 + process2 + process5; leveransorder.ProcessOrderShipment (orderprocess, 1000, 1000); 

5) Därefter kommer VPI-kunden. Eftersom han är berättigad till såväl gåvan som rabatter måste vi lägga till motsvarande funktioner i multicast-delegatens orderprocess. Innan vi fortsätter bör vi känna till de nuvarande delegaterna i kedjan och dess placering. Process5-delegat är för orderbekräftelse, som vi bör flytta till den sista i kedjan. Så delegeras process5-delegater från kedjan, sedan läggs process3- och process4-delegater till kedjan. Slutligen läggs process5-delegaten tillbaka innan samtalet sker till ProcessOrderShipment. Notera användningen av + = operatören. För att lägga till en delegat kan du använda + = operator. Och för att ta bort en delegat från kedjan kan du använda - = operatör.

 // Client 005: Processorder för VIP-kund. // VIP kvalificerad för gåva och rabatter // Beställnings-id: 1001. Kund-id 1001. Konsol.WriteLine ("----------------------" + "- ----------------------------------------- "+" ------ ------- "); Console.WriteLine ("Process VIP-kund"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); // Ta bort orderbekräftelsen från kedjan. // [Det borde vara på plats 5] orderprocess - = process5; // Lägg till processprocess 3 och 4 orderprocess + = process3; orderprocess + = process4; // Sätt tillbaka processen 5. // Eftersom orderbekräftelse borde vara det sista steget. orderprocess + = process5; leveransorder.ProcessOrderShipment (orderprocess, 1001, 1001); 

6) Nu kommer vi att ordna kedjan för vanlig kund. Vi vet nu hur delegatkedjan fungerar och därför krävs ingen förklaring. Nedan är koden:

 // Client 006: Processorder för vanlig kund. // Vanlig kund är inte berättigad till gåvor, // men får rabatter. // Så återkalla presentprocessen Console.WriteLine ("----------------------" + "------------- ----------------------------- "+" ------------- "); Console.WriteLine ("Process Regular Customer"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); orderprocess - = process4; leveranserorder. ProcessOrderShipment (orderprocess, 1002, 1002); 

Komplett kodexempel och dess utgång anges nedan:

 använder System; namespace Delegates2 {class DelegatesP2 {// 001: OrderShipment class. Processer // beställningen som gjorts av kundens offentliga klass OrderShipment {// 001_1: Förklara Multi-cast delegat. // Observera att returtypen ska vara ogiltig offentlig delegerad ogiltig OrderProcessingMethods (int OrderId, int CustomerId); // 001_2: Implementera orderbearbetningsfunktioner // Bearbetningsfunktion 1 public void GetShoppingCartItems (int OrderId, int CustomerId) {Console.WriteLine ("(1) GetShoppingCartItems"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Alla varukorgsartiklar är" + "Samlade."); Console.WriteLine ("Bildade en order med medföljande" + "Orderid"); Console.WriteLine ("______________________" + "____________________________________" + "_____________"); } // Bearbetningsfunktion 2 public void CalculOrderPrice (int OrderId, int Customerid) {Console.WriteLine ("(2) CalculOrderPrice"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Pris för varje insamlad produkt" + "från varukorgen sammanfattad"); Console.WriteLine ("Orderpris beräknat"); Console.WriteLine ("______________________" + "____________________________________" + "_____________"); } // Bearbetningsfunktion 3 public void CalculDiscount (int OrderId, int Customerid) {Console.WriteLine ("(3) CalculDiscount"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Få rabattbeloppet för VIP"); Console.WriteLine ("Minska orderpriset"); Console.WriteLine ("______________________" + "____________________________________" + "_____________"); } // Bearbetar funktion 4 public void AwordFreeGifts (int OrderId, int Customerid) {Console.WriteLine ("(4) AwordFreeGifts"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Vanlig kund. Hämta en gåva"); Console.WriteLine ("Placera presentföremålet i" + "Beställ gratis"); Console.WriteLine ("______________________" + "____________________________________" + "_____________"); } // Bearbetningsfunktion 5 public void GetOrderConfirmation (int OrderId, int Customerid) {Console.WriteLine ("(5) GetOrderConfirmation"); Console.WriteLine ("=======================" + "========"); Console.WriteLine ("Skärmen för beställningsbekräftelse" + "visas för användaren"); Console.WriteLine ("Beställning bekräftad"); Console.WriteLine ( ""); } // 001_3: Tar en multicase-delegat och utför // affärslogik public void ProcessOrderShipment (OrderProcessingMethods ProcessToFollow, int Orderid, int Customerid) {ProcessToFollow (Orderid, Customerid); }} [STAThread] static void Main (string [] args) {// Client 001: Create Orderhipment Object OrderShipment deliverorders = new OrderShipment (); // Kund 002: Förklara delegaten. // Vi kommer att använda det som Multicast-delegat OrderShipment.OrderProcessingMethods orderprocess; // Client 003: Create Delegate Instances OrderShipment.OrderProcessingMethods process1 = new OrderShipment.OrderProcessingMethods (leveransorder.GetShoppingCartItems); OrderShipment.OrderProcessingMethods process2 = new OrderShipment.OrderProcessingMethods (leveransorder. BeräknaOrderPrice); OrderShipment.OrderProcessingMethods process3 = new OrderShipment.OrderProcessingMethods (leveransorder. Beräkna rabatt); OrderShipment.OrderProcessingMethods process4 = new OrderShipment.OrderProcessingMethods (leveransorder.AwordFreeGifts); OrderShipment.OrderProcessingMethods process5 = new OrderShipment.OrderProcessingMethods (leveransorder.GetOrderConfirmation); // Client 004: Processorder för normal kund. // Beställnings-id: 1000. Kund-id 1000. Konsol.WriteLine ("----------------------" + "--------- --------------------------------- "+" ------------- " ); Console.WriteLine ("Process Normal Customer"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); // Observera att du kan använda + = operator också orderprocess = process1 + process2 + process5; leveransorder.ProcessOrderShipment (orderprocess, 1000, 1000); // Client 005: Processorder för VIP-kund. // VIP kvalificerad för gåva och rabatter // Beställnings-id: 1001. Kund-id 1001. Konsol.WriteLine ("----------------------" + "- ----------------------------------------- "+" ------ ------- "); Console.WriteLine ("Process VIP-kund"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); // Ta bort orderbekräftelsen från kedjan. // [Det borde vara på plats 5] orderprocess - = process5; // Lägg till processprocess 3 och 4 orderprocess + = process3; orderprocess + = process4; // Sätt tillbaka processen 5. // Eftersom orderbekräftelse borde vara det sista steget. orderprocess + = process5; leveransorder.ProcessOrderShipment (orderprocess, 1001, 1001); // Client 006: Processorder för vanlig kund. // Vanlig kund är inte berättigad till gåvor, // men får rabatter. // Så återkalla presentprocessen Console.WriteLine ("----------------------" + "------------- ----------------------------- "+" ------------- "); Console.WriteLine ("Process Regular Customer"); Console.WriteLine ("----------------------" + "-------------------- ---------------------- "+" ------------- "); orderprocess - = process4; leveranserorder. ProcessOrderShipment (orderprocess, 1002, 1002); }}} 

Produktion

Delegera kedjeproduktion |