js实现观察者模式风格替换
如下图,我们看到两种风格:在选择男士时,页面颜色为黑色;在选择女士时,页面颜色为粉红色。
主要可以分为两类:
下拉框 ---》 被观察者
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实现观察者模式风格替换的更多相关文章
- JS实现IOS风格对话框 jquery / zepto
Alert alert("这个是一个alert弹窗"); Alert 自定义参数 alert({ content: "自定义alert弹窗", btnText: ...
- 使用 iosOverlay.js 创建 iOS 风格的提示和通知
iosOverlay.js 用于在 Web 项目中实现 iOS 风格的通知和提示效果.为了防止图标加载的时候闪烁,你需要预加载的图像资源.不兼容 CSS 动画的浏览器需要 jQuery 支持.浏览器兼 ...
- js用replaceAll全部替换的方法
1 前言 js中字符串整体替换,只有自带的replace,并没有replaceAll,如果我们需要把字符串中的字符统一替换,可以用正则表达式,由于经常使用就在String直接加个原生方法,方便调用. ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- js中字符串全部替换
废话不多说,直接发结果 在js中字符串全部替换可以用以下方法: str.replace(/需要替换的字符串/g,"新字符串") 比如: "yyyy-MM-dd-hh-mm ...
- js使用占位符替换字符串
js使用占位符替换字符串是一个ES6中的模版字符串语法. 在``中使用 ${} var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and ...
- JS 正则查找与替换
JS正则查找与替换 一.前提/背景 今天遇到个问题,需要替换字符串中部分字符,这些字符相对整个字符串而言,与其他子字符串类似,无法单独提出:重要的是,该字符串是动态的生成的,就像我们日常看到的网页Ur ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- js实现观察者模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。
官方参数解释: Convolution 2D tflearn.layers.conv.conv_2d (incoming, nb_filter, filter_size, strides=1, pad ...
- 子文件夹的遍历(python、matlab)
1. python 使用 os.listdir:Python Tricks(九)-- 递归遍历目录下所有文件 使用 os.walk: os.walk返回的是生成器(Generator),需迭代访问: ...
- 3.多线程传参,以及tuple数组
#include <Windows.h> #include <thread> #include <iostream> #include <tuple> ...
- Web前端错题模糊题记录
title: Web前端错题模糊题记录 toc: true date: 2018-09-20 10:04:36 categories: Web tags: HTML CSS JavaScript HT ...
- WPF学习(三) - 依赖属性
学习WPF时,我在看一本叫做“深入浅出WPF”的书.整整20页都在讲依赖性性和附加属性,反复看了几遍居然还是不懂,真是郁闷. 上一篇中WPF绑定的例子,其实已经用到了依赖属性. // 作为被绑定的目标 ...
- 爬虫来啦!Day91
# 一.爬虫# 1.基本操作# 排名爬虫刷票# 抽屉网的所有发布新闻点赞# 自动化程序模拟用于的日常操作# 投票的机制是利用cookies,禁用cookies模式# 自定义的异步IO模块就是Socke ...
- logging.config模块---使用配置文件管理logger
logging配置文件 一.使用到的模块: logging.config 官方文档: https://docs.python.org/3/library/logging.config.html 非官方 ...
- 微信小程序 刷新页面
一 , 当前页面刷新 第一种方式: //pages 获取到当前页码数 然后执行当前页的onLoad const pages = getCurrentPages() ] perpage.onLoad() ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...
- linux 连接 NAS
[root@kvm-server ~]# mount -o username=user01,password=1234567890 //192.168.31.20/share /mnt/nas Cou ...