Javascript 模式實(shí)例 觀察者模式
更新時(shí)間:2009年10月24日 12:07:13 作者:
首先我們看看觀察者的概念 觀察者模式:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
在園里有許多牛人都已經(jīng)寫過這些文章,不過大多的例子都是.NET,今天我要舉一個(gè)JS的使用實(shí)例.有興趣的朋友可以先了解一下一些牛人的,比如李會(huì)軍大哥設(shè)計(jì)模式篇中觀察者的那一節(jié)
http://www.cnblogs.com/Terrylee/archive/2006/10/23/Observer_Pattern.html
說說我自己對(duì)這模式的理解,其思想核心是:每個(gè)被觀察對(duì)象都依據(jù)對(duì)象數(shù)據(jù)的改變而改變,被觀察對(duì)象一定要有同樣的改變行為來約束,這個(gè)約束是被觀察對(duì)象提供給觀察器的統(tǒng)一接口。觀察器會(huì)開發(fā)改變數(shù)據(jù)的行為。
JS是弱類型的腳本,很多東西都要約定的,不象.NET會(huì)有接口的約束,廢話不多說,我們直接看實(shí)例:
觀察者實(shí)例
var ObserverObj = { /**//*依賴對(duì)象*/
FirstName: "Max",
LastName: "Gan",
Id: 1
}
var ObserverManager = { /**//*觀察器*/
Observers:[], /**//*觀察對(duì)象集*/
AddObserver: function(item){/**//*加入觀察對(duì)象*/
this.Observers.push(item);
},
Change: function(obj){ /**//*改變對(duì)象行為*/
for(var item in obj){
ObserverObj[item] = obj[item];
}//改變數(shù)據(jù)依賴對(duì)象數(shù)據(jù)
for(var i = 0,len = this.Observers.length; i < len; i++){
var item = this.Observers[i];
item.Display(); //對(duì)象改變后,改變觀察對(duì)象的行為Display; 為統(tǒng)一的接口
}
}
}
var Header = function(){ /**//*觀察對(duì)象Header*/
this.Display = function(){
alert(ObserverObj.FirstName);
}
}
var Content = function(){ /**//*觀察對(duì)象Content*/
this.Display = function(){
alert(ObserverObj.LastName);
}
}
var Foot = function(){ /**//*觀察對(duì)象Foot*/
this.Display = function(){
alert(ObserverObj.Id);
}
}
上面的例子ObserverManager只提供了綁定的方法(AddObserver),其他的什么取消綁定啊之類的代碼技巧,可能大家想一下就知道了.其實(shí)這些代碼的最終目的就是當(dāng)改變了Observers數(shù)據(jù),其他的被對(duì)象也會(huì)根據(jù)數(shù)據(jù)的改變作出相應(yīng)的回應(yīng).OK,現(xiàn)在我們把他們綁定一下.
/***綁定觀察器動(dòng)作***/
ObserverManager.AddObserver(new Header());
ObserverManager.AddObserver(new Content());
ObserverManager.AddObserver(new Foot());
最后我們使用會(huì)怎么使用呢?(一個(gè)低能的問題...呵呵)看例子.
使用方法
<!--使用方法-->
<a href="javascript://" onclick="ObserverManager.Change({FirstName:'老婆'});">改變FirstName</a>
<a href="javascript://" onclick="ObserverManager.Change({LastName:'是母老虎'});">改變LastName</a>
<a href="javascript://" onclick="ObserverManager.Change({Id:2});">改變Id</a>
我把整個(gè)例子都附上了,有興趣的朋友可以下載來看看.
Javascript觀察者模式.rar
一個(gè)人能夠走多遠(yuǎn),取決于與誰同行
http://www.cnblogs.com/Terrylee/archive/2006/10/23/Observer_Pattern.html
說說我自己對(duì)這模式的理解,其思想核心是:每個(gè)被觀察對(duì)象都依據(jù)對(duì)象數(shù)據(jù)的改變而改變,被觀察對(duì)象一定要有同樣的改變行為來約束,這個(gè)約束是被觀察對(duì)象提供給觀察器的統(tǒng)一接口。觀察器會(huì)開發(fā)改變數(shù)據(jù)的行為。
JS是弱類型的腳本,很多東西都要約定的,不象.NET會(huì)有接口的約束,廢話不多說,我們直接看實(shí)例:
觀察者實(shí)例
復(fù)制代碼 代碼如下:
var ObserverObj = { /**//*依賴對(duì)象*/
FirstName: "Max",
LastName: "Gan",
Id: 1
}
var ObserverManager = { /**//*觀察器*/
Observers:[], /**//*觀察對(duì)象集*/
AddObserver: function(item){/**//*加入觀察對(duì)象*/
this.Observers.push(item);
},
Change: function(obj){ /**//*改變對(duì)象行為*/
for(var item in obj){
ObserverObj[item] = obj[item];
}//改變數(shù)據(jù)依賴對(duì)象數(shù)據(jù)
for(var i = 0,len = this.Observers.length; i < len; i++){
var item = this.Observers[i];
item.Display(); //對(duì)象改變后,改變觀察對(duì)象的行為Display; 為統(tǒng)一的接口
}
}
}
var Header = function(){ /**//*觀察對(duì)象Header*/
this.Display = function(){
alert(ObserverObj.FirstName);
}
}
var Content = function(){ /**//*觀察對(duì)象Content*/
this.Display = function(){
alert(ObserverObj.LastName);
}
}
var Foot = function(){ /**//*觀察對(duì)象Foot*/
this.Display = function(){
alert(ObserverObj.Id);
}
}
上面的例子ObserverManager只提供了綁定的方法(AddObserver),其他的什么取消綁定啊之類的代碼技巧,可能大家想一下就知道了.其實(shí)這些代碼的最終目的就是當(dāng)改變了Observers數(shù)據(jù),其他的被對(duì)象也會(huì)根據(jù)數(shù)據(jù)的改變作出相應(yīng)的回應(yīng).OK,現(xiàn)在我們把他們綁定一下.
復(fù)制代碼 代碼如下:
/***綁定觀察器動(dòng)作***/
ObserverManager.AddObserver(new Header());
ObserverManager.AddObserver(new Content());
ObserverManager.AddObserver(new Foot());
最后我們使用會(huì)怎么使用呢?(一個(gè)低能的問題...呵呵)看例子.
使用方法
復(fù)制代碼 代碼如下:
<!--使用方法-->
<a href="javascript://" onclick="ObserverManager.Change({FirstName:'老婆'});">改變FirstName</a>
<a href="javascript://" onclick="ObserverManager.Change({LastName:'是母老虎'});">改變LastName</a>
<a href="javascript://" onclick="ObserverManager.Change({Id:2});">改變Id</a>
我把整個(gè)例子都附上了,有興趣的朋友可以下載來看看.
Javascript觀察者模式.rar
一個(gè)人能夠走多遠(yuǎn),取決于與誰同行
您可能感興趣的文章:
- JavaScript觀察者模式(publish/subscribe)原理與實(shí)現(xiàn)方法
- JavaScript觀察者模式(經(jīng)典)
- NodeJS設(shè)計(jì)模式總結(jié)【單例模式,適配器模式,裝飾模式,觀察者模式】
- 深入理解Javascript中的觀察者模式
- Javascript設(shè)計(jì)模式之觀察者模式的多個(gè)實(shí)現(xiàn)版本實(shí)例
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之觀察者模式
- javascript觀察者模式實(shí)現(xiàn)自動(dòng)刷新效果
- JavaScript設(shè)計(jì)模式之觀察者模式實(shí)例詳解
- PHP觀察者模式實(shí)例分析【對(duì)比JS觀察者模式】
- JavaScript觀察者模式原理與用法實(shí)例詳解
相關(guān)文章
js自動(dòng)滑動(dòng)+鼠標(biāo)滑動(dòng)區(qū)域
js自動(dòng)滑動(dòng)+鼠標(biāo)滑動(dòng)區(qū)域...2007-08-08JavaScript 函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef) 分享
這篇文章主要介紹了在JS中函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef)的誤區(qū)我們通過實(shí)例說明一下,有需要的朋友可以參考2013-07-07微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)調(diào)用相機(jī)自動(dòng)拍照功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)調(diào)用相機(jī)自動(dòng)拍照功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06postman+json+springmvc測(cè)試批量添加實(shí)例
下面小編就為大家分享一篇postman+json+springmvc測(cè)試批量添加實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03IE8提示Invalid procedure call or argument 異常的解決方法
某臺(tái)機(jī)器上,訪問公司的好幾個(gè)產(chǎn)品網(wǎng)站,都拋出很多 Invalid procedure call or argument ,跟進(jìn)了下,情況最后簡(jiǎn)化為2012-09-09