設(shè)計模式之觀察者模式(Observer Pattern)(二)
2024-07-21 02:16:29
供稿:網(wǎng)友
 
在上例子中傳遞的信息是一個字符串,當(dāng)我們點擊其中一個radio button,我們可以得到這個radio button的名稱(red blue green),將這個名稱發(fā)送到觀察者(observer)。
observer提供一個對目標主體(subject)抽象連接,一個目標主體(subject)不知道他的觀察者(observer)的任何信息,但是當(dāng)他改變時可以更新通知發(fā)送到各個注冊過的觀察者(observer)。
我們也可以使用委托(delegate)來實現(xiàn)observer模式
public class subject
 '定義委托
 public delegate sub sendmessagedelegate(byval aprice as string)
 '定義事件
 public event sendmessage as sendmessagedelegate
 dim _askprice as string
 
 public writeonly property message() as string
 set(byval value as string)
 _askprice = value
 '引發(fā)事件
 raiseevent sendmessage(_askprice)
 end set
 end property
end class
在主窗體中:
dim lscol as new listobs
 dim frcol as new frmd
 public sub new()
 mybase.new()
 form1 = me
 initializecomponent()
 dim evh as eventhandler = new eventhandler(addressof radiohandler)
 addhandler opred.click, evh
 addhandler opblue.click, evh
 addhandler opgreen.click, evh
 lscol.show() ‘顯示兩個observer
 frcol.show()
end sub
‘處理radio button的單擊事件
protected sub radiohandler(byval sender as object, byval e as eventargs)
 dim i as integer
 dim rbut as windows.forms.radiobutton = ctype(sender, windows.forms.radiobutton)
 dim subject as new subject
 dim adelegate as subject.sendmessagedelegate = new subject.sendmessagedelegate(addressof lscol.add)
 dim adelegate1 as subject.sendmessagedelegate = new subject.sendmessagedelegate(addressof frcol.drawmessage)
 ‘布線
 addhandler subject.sendmessage, adelegate
 addhandler subject.sendmessage, adelegate1
 'addhandler subject.sendmessage, addressof lscol.add
 'addhandler subject.sendmessage, addressof frcol.drawmessage
 subject.message = rbut.text
‘撤銷布線
 removehandler subject.sendmessage, adelegate
 removehandler subject.sendmessage, adelegate1
end sub
在listbox窗體和colorframe窗體分別定義委托所指向的事件:
‘listbox窗體
public sub add(byval mesg as system.string)
 lscolors.items.add(mesg)
 end sub
‘colorframe窗體
public sub drawmessage(byval mesg as system.string)
 colname = mesg
 select case mesg.tolower
 case "red"
 pic.backcolor = color.red '
 case "blue"
 pic.backcolor = color.blue
 case "green"
 pic.backcolor = color.green
 end select
 end sub
這樣也可以實現(xiàn)相同的效果。
 
參考資料:
設(shè)計模式:利用c#的delegate來改進observer模式 作者:盧彥
探究觀察者設(shè)計模式
 剛開始學(xué)習(xí)設(shè)計模式在.net中的應(yīng)用,希望對大家在學(xué)習(xí)過程中有所幫助!
可以寫信給我進行交流!