如下图,我们看到两种风格:在选择男士时,页面颜色为黑色;在选择女士时,页面颜色为粉红色。
    主要可以分为两类:
            下拉框 ---》 被观察者
            div   ---》 观察者



面向过程实现风格替换:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<style>
    div{
        border: 1px solid #000000;
        width: 400px;
        height:100px;
        margin-top: 5px;
    }
</style>
<body>
<select name="" id="">
    <option value="man" selected>男士</option>
    <option value="woman">女士</option>
</select>
<div id="one"></div>
<div id="two"></div>
<div id="three"></div>
</body>
<script>
    var sel=document.getElementsByTagName('select')[0];
    var one=document.getElementById("one");
    var two=document.getElementById("two");
    one.style.background="black";
    two.innerHTML="i am superman";
    window.onload=function(){
        sel.onchange=function(){
            var sv=sel.value;
            if(sv=="woman"){
                one.style.background="pink";
                two.innerHTML="i am superwoman";
            }else if(sv=="man"){
                one.style.background="black";
                two.innerHTML="i am superman";
            }
        }
    }
</script>
</html>

观察者模式实现风格替换:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<style>
    div{
        border: 1px solid #000000;
        width: 400px;
        height:100px;
        margin-top: 5px;
    }
</style>
<body>
<select name="" id="">
    <option value="man" selected>男士</option>
    <option value="woman">女士</option>
</select>
<div id="one"></div>
<div id="two"></div>
<!--
    如果新增加一个 div3 就需要修改旧的代码了,可以看出这种方式的扩展性就特别的低。
    因为在面向对象编程中有中思维叫:开闭原则。对于修改是封闭的,对于扩展是开放的。
    解决方案:
          我们可以用观察者模式,解决这一扩展性低问题。
          观察者模式,顾名思义:重点是观察下拉框(被观察者)的改变,
     当下拉框改变时,div(观察者)做出相应改变。
-->
<div id="three"></div>
</body>
<script>
    var sel=document.getElementsByTagName('select')[0];
    var one=document.getElementById("one");
    var two=document.getElementById("two");
    one.style.background="black";
    two.innerHTML="i am superman";
    //定义一个对象,用来存储观察者对象。
    sel.servers={};
    //定义一个添加观察者方法
    sel.attach=function(key,val){
        sel.servers[key]=val;
    };
    //将观察者添加到观察者队列中
    sel.attach("one",one);
    sel.attach("two",two);
    sel.onchange=function(){
        for(var i in this.servers){
            this.servers[i].update(this);
        }
    };
    one.update=function(obj){
        if(obj.value=="man"){
            this.style.background="black";
        }else{
            this.style.background="pink";
        }
    };
    two.update=function(obj) {
        if (obj.value == "man") {
            this.innerHTML = "i am superman";
        } else {
            this.innerHTML = "i am superwoman";
        }
    };
    //当再出现观察者时,我们只需要将观察者添加到观察者队列中。
    //降低了代码的耦合性,增加了代码的扩展性。
    var three=document.getElementById('three');
    sel.attach("three",three);
    three.update=function(obj) {
        if (obj.value == "man") {
            this.innerHTML = "man";
        } else {
            this.innerHTML = "woman";
        }
    };
</script>
</html>

js实现观察者模式风格替换的更多相关文章

  1. JS实现IOS风格对话框 jquery / zepto

    Alert alert("这个是一个alert弹窗"); Alert 自定义参数 alert({ content: "自定义alert弹窗", btnText: ...

  2. 使用 iosOverlay.js 创建 iOS 风格的提示和通知

    iosOverlay.js 用于在 Web 项目中实现 iOS 风格的通知和提示效果.为了防止图标加载的时候闪烁,你需要预加载的图像资源.不兼容 CSS 动画的浏览器需要 jQuery 支持.浏览器兼 ...

  3. js用replaceAll全部替换的方法

    1 前言 js中字符串整体替换,只有自带的replace,并没有replaceAll,如果我们需要把字符串中的字符统一替换,可以用正则表达式,由于经常使用就在String直接加个原生方法,方便调用. ...

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  5. js中字符串全部替换

    废话不多说,直接发结果 在js中字符串全部替换可以用以下方法: str.replace(/需要替换的字符串/g,"新字符串") 比如: "yyyy-MM-dd-hh-mm ...

  6. js使用占位符替换字符串

    js使用占位符替换字符串是一个ES6中的模版字符串语法. 在``中使用 ${} var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and ...

  7. JS 正则查找与替换

    JS正则查找与替换 一.前提/背景 今天遇到个问题,需要替换字符串中部分字符,这些字符相对整个字符串而言,与其他子字符串类似,无法单独提出:重要的是,该字符串是动态的生成的,就像我们日常看到的网页Ur ...

  8. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  9. js实现观察者模式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. VC++基于CXImage库实现缩略图

    一般的图像处理软件都对读入程序的图像文件建一个缩略图的列表,像ACDSee那样.笔者最近在做一个图像处理的项目,处理的原始数据就是图像文件.从项目一开始就想做一个缩略图,但一直苦于技术水平有限,且时间 ...

  2. [Codeforces 1051F] The Shortest Statement 解题报告(树+最短路)

    题目链接: https://codeforces.com/contest/1051/problem/F 题目大意: 给出一张$n$个点,$m$条边的带权无向图,多次询问,每次给出$u,v$,要求输出$ ...

  3. luogu 1558 色板游戏

    写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路..... 色板游戏 色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格.并从左到 ...

  4. kettle工具的设计原则

    不多说,直接上干货! Kettle工具在设计初,就考虑到了一些设计原则.这些原则里借鉴了以前使用过的其他一些ETL工具积累下的经验和教训. 易于开发:作为数据仓库和ETL开发者,你只想把时间用在创建B ...

  5. (2016北京集训十四)【xsy1557】task

    题解: 限制可以看成图状结构,每个任务的对物品数量的影响可以看成权值,只不过这个权值用一个五元组来表示. 那么题意要求的就是最大权闭合子图,网络流经典应用. 代码: #include<algor ...

  6. EasyUI Combotree只选择叶子节点

    EasyUI Combotree的方法拓展自Combo和Tree.而Tree有一个onBeforSelect事件来帮助我们实现只选择叶子节点的功能. Tree事件需要 'node' 参数,它包括下列属 ...

  7. nginx upstream

    nginx转发http和tcp http转发 upstream goforit_201 { server 172.168.10.10:201; } server { listen 201; serve ...

  8. 紫书 例题8-9 UVa 1451 (数形结合)

    这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做 因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系 到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率 要做两个处理 ...

  9. HDU 2782 The Worm Turns (DFS)

    Winston the Worm just woke up in a fresh rectangular patch of earth. The rectangular patch is divide ...

  10. spring 、Mybatis配置sql server数据库

    学习了:http://www.cnblogs.com/amwicfai/p/3181003.html beans.xml中的配置写法: <!-- 数据源 --> <bean id=& ...