觀察者模式 Observer
實現目標:變換select框來變動內容區和廣告區
一般思路
1:判斷選中的值
2:順序下來,根據值,修改內容地區
3:再修改廣告地區.
if(v == '男') { 內容區背景變灰 廣告區內容變成男人話題}elseif(v == '女'){ 內容區背景變粉 廣告區內容變成女人話題}
那麼問題有哪些:
1:讓你選擇時引起3個地區的變化,是否要修改if/elseif部分
2:如果選擇女性樣式,但不要變粉,現在流行變紫色,是否又要修改if elseif部分?
問題在於: 控制邏輯與被操作對象耦合嚴重.
這是就需要觀察者模式
js實現觀察者模式
我們讓div對象觀察select的變化,select變化,就會通知到這兩個對象。並引起這2個對象的變化,實現觀察者模式。
下邊是解決效果
select對象負責attach,detach,notifyObservers,與具體的對象變化解耦。
1.index.html
<body><selectname=''id=""><optionvalue='male'>男士風格option><optionvalue='female'>女士風格option>select><inputtype='button'value="觀察學習區"onclick="t1();"><inputtype='button'value="不再觀察學習區"onclick="t2();"><divid='content'>我是內容div><divid='ad'>我是廣告div><divid='study'>我是學習區div>body>
2.index.html中js部分
<script>//擷取對象var sel = document.getElementsByTagName('select')[0]; //定義方法 sel.observers={}; //增加某個方法 sel.attach = function(key,obj){this.observers[key] = obj; } //卸掉某個方法 sel.detach = function(key){deletethis.observers[key]; } //通知 sel.onchange = sel.notify = function(){for(var key inthis.observers){ this.observers[key].update(this);//去調用對象的update方法 } } //用戶端var content = document.getElementById('content'); var ad = document.getElementById('ad'); //內容區變化效果 content.update = function(observer){if(observer.value=='male'){ this.style.backgroundColor='gray'; }elseif(observer.value=='female'){ this.style.backgroundColor='pink'; } } //廣告區變化效果 ad.update = function(observer){if(observer.value=='male'){ this.innerHTML='汽車'; }elseif(observer.value=='female'){ this.innerHTML='減肥'; } } //確定誰來監視變化 sel.attach('content',content); sel.attach('ad',ad); study = document.getElementById('study'); sel.attach('study',study);//預設為觀察學習區 study.update = function(observer){if(observer.value=='male'){ this.innerHTML='學習電腦'; }elseif(observer.value=='female'){ this.innerHTML='學習減肥'; } } //增加學習區的觀察functiont1(){ sel.attach('study',study); } //取消學習區的觀察functiont2(){ sel.detach('study'); }script>
總結:
- 當有另一個觀察對象加入的時候直接添加一個就好
- 降低了主題對象和觀察者對象的耦合度
- 好的設計模式不會直接進入你的代碼中,而是進入你的大腦中
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
').text(i)); }; $numbering.fadeIn(1700); }); });
以上就介紹了PHP設計模式之JS實現觀察者模式,包括了觀察者模式,設計模式方面的內容,希望對PHP教程有興趣的朋友有所協助。