• js实现观察者模式


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>面向对象之观察者模式</title>
    </head>
    <style type="text/css">
           .word{
                 width:500px;
                 height: 150px;
                 border:1px solid #333;
                 margin-top:20px;
           }
    
    </style>
    <body>
           <h1>用观察者模式来切换</h1>
           <select name=""  id="">
               <option value="default">默认风格</option>    
               <option value="male">男士风格</option>
               <option value="female">女士风格</option>
           </select>
           <input type="button" name="" value="观察动作栏" onclick="t1();">
           <input type="button" name="" value="不观察动作栏" onclick="t2();">
              <div class="word" id="content">内容</div>
              <div class="word" id="ad">广告</div>
              <div class="word" id="study">动作</div>
    </body>
    <script type="text/javascript">
            var sel =document.getElementsByTagName('select')[0];
            sel.observers={};
            sel.attach=function(key,obj){
                this.observers[key]=obj; 
            }
            sel.detach=function(key){
                delete this.observers[key];
            }
            //追踪监听
            sel.onchange=sel.notify=function(){
                for(var key in  this.observers){
                    this.observers[key].update(this);
                }
            }
            //客户端
           var content= document.getElementById('content');
             content.update=function(observee){
                  if(observee.value=='male'){
                      this.style.backgroundColor='gray';
                  }else if(observee.value=='female'){
                      this.style.backgroundColor='pink';
                  }
            }
            var ad= document.getElementById('ad');
             ad.update=function(observee){
                  if(observee.value=='male'){
                      this.innerHTML='汽车';
                  }else if(observee.value=='female'){
                      this.innerHTML='化妆品';
                  }
            }
            //让content观察select的变化
            sel.attach('content',content);
            sel.attach('ad',ad);
            //耦合度低
            var study=document.getElementById('study');
            study.update=function(observee){
                if(observee.value=='male'){
                      this.innerHTML='学习计算机';
                }else if(observee.value=='female'){
                     this.innerHTML='学习美容';
                }
            } 
            sel.attach('study',study);
    
    
            function t1(){
                sel.attach('study',study);
            }
            function t2(){
               sel.detach('study');
            }
    
    </script>
    </html>

  • 相关阅读:
    【bzoj2079】[Poi2010]Guilds 构造结论题
    【bzoj1899】[Zjoi2004]Lunch 午餐 dp
    【bzoj1345】[Baltic2007]序列问题Sequence 单调栈
    【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
    【bzoj1044】[HAOI2008]木棍分割 二分+dp
    【bzoj5037】[Jsoi2014]电信网络 最大权闭合图
    【bzoj5018】[Snoi2017]英雄联盟 背包dp
    【bzoj5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
    【bzoj2213】[Poi2011]Difference dp
    【bzoj2161】布娃娃 权值线段树
  • 原文地址:https://www.cnblogs.com/kangshuai/p/5784428.html
Copyright © 2020-2023  润新知