設(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í)過程中有所幫助!
可以寫信給我進行交流!