6 Multicast Delegate

1 4.6 Multicast Delegate

K ita dapat membuat Multicast Delegate dengan cara mengkombinasikan beberapa delegate menjadi satu delegate tunggal. Awalnya konsep ini akan menyulitkan buat anda, tapi anda akan sangat berterima kasih kepada tim pembuat CLI disaat an da menghadapi kasus dimana dibutuhkan Multicast Delegate. Mari kita lihat contoh dima na Multicast Delegate sa ngat berguna. Pada contoh pertama, kita memiliki sistem inventory dan class InventoryM anager yang bertugas untuk melakukan pendataan bahan material p ada satu lokasi warehouse. Pendataan ini menghasilkan jumlah bahan yang tersedia

b ergantung pada nomor SKU (Stock Keeping Unit). Untuk menyederhanakan p ermasalahan, anda bisa menggunakan bilangan acak untuk menghasilkan jumlah

b ahan. Pada tiap iterasi dalam pendataan bahan, class InventoryManager akan m emanggil method callback untuk mendeteksi apakah jumlah bahan yang tersedia lebih k ecil dari nilai minimum yaitu 50. Satu delegate cukup untuk membuat program ini, tetapi bagaimana jika anda ha rus mencatat kejadian (event) disaat anda menemukan jumlah barang yang tersedia l ebih kecil dari nilai minimum dan langsung mengirim email la poran ke Purchasing Manager tentang kejadian ini? Tentu saja anda perlu membuat satu delegate gabungan dari beberapa delegate, perhatikan kode program berikut:

us i ng Sy s t em; us i ng Sy s t em. Thr eadi ng;

c l as s Bahan { publ i c Bahan( s t r i ng s k u) { t hi s . Sk u = s k u;

Random r = new Random( Dat eTi me. Now. Mi l l i s ec ond) ;

doubl e d = r . Nex t Doubl e( ) * 100;

t hi s . Ter s edi a = ( i nt ) d; } t hi s . Ter s edi a = ( i nt ) d; }

get { r et ur n t hi s . s k u; } s et { t hi s . s k u = v al ue ; }

pr ot ec t ed i nt t er s edi a; publ i c i nt Ter s edi a {

c l as s I nv ent or y Man ager { pr ot ec t ed c ons t i nt MI N_TERSEDI A = 50; publ i c Bahan[ ] bahan; publ i c I nv ent or y Manager ( ) {

Cons ol e. Wr i t eLi ne( " [ I nv ent or y Manager . I nv ent or y Manager ] " + " Menamba h Bahan. . . " ) ; bahan = new Bahan[ 5] ;

f or ( i nt i = 0; i < 5; i ++) {

Bahan bhn = new Bahan( " Bahan " + ( i + 1) ) ; Thr ead. Sl eep( 10) ; // Randomi z er is s eeded by t i me. bahan[ i ] = bhn; Cons ol e. Wr i t eLi ne( " \ t Par t ' { 0} ' on- hand = { 1} " , bhn. Sk u, bhn. Ter s edi a) ;

publ i c del egat e v oi d Out Of St oc k Ex c ept i onMet hod( Bahan bahan) ; publ i c v oi d Pr o c es s I nv ent or y ( Out Of St oc k Ex c ept i onMet hod ex c ept i on) {

Cons ol e. Wr i t eLi ne( " \ n[ I nv ent or y Manager . Pr oc es s I nv ent or y ] " + " Mel ak uk an Pr os es I nv ent or y . . . " ) ;

f or eac h ( Bahan bhn in bahan)

{ if ( bhn. Ter s edi a < MI N_TERSEDI A)

Cons ol e. Wr i t eLi ne( " \ n\ t { 0} ( { 1} uni t s ) = " + " di bawah angk a mi ni mum t er s edi a { 2} " , bhn. Sk u, bhn. Ter s edi a, MI N_TERSEDI A) ;

ex c ept i on( bhn) ;

c l as s Co mpos i t eDel egat e { c l as s Co mpos i t eDel egat e {

C ons ol e. Wr i t eLi ne( " \ t [ Compos i t eDel egat e. LogEv ent ] " + " menc at at ev ent . . . " ) ; }

publ i c s t at i c v oi d Emai l Pur c has i ngMgr ( Bahan bahan) { Cons ol e. Wr i t eLi ne( " \ t [ Compos i t eDel egat e" + " . Emai l Pur c has i ngMgr ] Ki r i m emai l k e manager . . . " ) ; }

publ i c s t at i c v oi d Mai n( ) {

I nv ent or y Manager mgr = new I nv ent or y Manager ( ) ;

I nv ent or y Manager . Out Of St oc k Ex c ept i onMet hod

LogEv ent Cal l bac k = new

I nv ent or y Manager . Out Of St oc k Ex c ept i onMet hod( LogEv ent ) ;

I nv ent or y Manager . Out Of St oc k Ex c ept i onMet hod

Emai l Pur c has i ngMgr Cal l bac k = new

I nv ent or y Manager . Out Of St oc k Ex c ept i o nMet hod( Emai l Pur c has i ngMgr ) ;

I nv ent or y Manager . Out Of St oc k Ex c ept i onMet hod OnHandEx c ept i onEv e nt s Cal l bac k = Emai l Pur c has i ngMgr Cal l bac k + LogEv ent Cal l bac k ;

mgr . Pr oc es s I nv ent or y ( OnHandEx c ept i onEv ent s Cal l bac k ) ;

Cons ol e. ReadLi ne( ) ; } };

Jika anda menjalankan program ini, hasilnya ditunjukkan pada gambar 14.5. Pelajaran apa yang anda peroleh? Ternyata dalam C# kita bisa secara dinamik menentukan method-method yang berhubungan dengan suatu method callback, menggabungkan method-method tersebut ke dalam satu delega te dengan operator plus (+). Runtime

a kan secara otomatis akan menjamin bah wa method-method tersebut dipanggil secara

be rurut an. Lebih jauh lagi, anda dapat mengeluarkan delegate dari gabungannya dengan menggunakan operator minus (-).

Gamba r 14.5. Multicast delegate memungkinka n anda untuk menggabungkan beberapa obyek delegate menjadi satu delegate tunggal.