JavaScript状态模式及适配器模式使用讲解
作者:volit_ 发布时间:2024-04-19 10:14:05
标签:JavaScript,状态模式,适配器模式
一、状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类
1.基本实现
//下面以一个开灯程序演示状态模式
//灯共用三种状态,分别是‘关闭',‘弱光‘和'强光‘。每次按下开关按钮都会换挡。
let OfflightState = function (light) {
this.light = light;
}
OfflightState.prototype.buttonPressed = function () {
console.light('弱光');
this.light.setState(this.light.weakLightState);
}
let WeakLightState = function (light) {
this.light = light;
}
WeakLightState.prototype.buttonPressed = function () {
console.log('强光')
this.light.setState(this.light.strongLightState);
}
let StrongLightState = function (light) {
this.light = light;
}
StrongLightState.prototype.buttonPressed = function () {
console.log('关闭');
this.light.setState(this.light.offlightState)
}
let Light = function () {
this.offlightState = new OfflightState(this);
this.weakLightState = new WeakLightState(this);
this.strongLightState = new StrongLightState(this);
this.button = null;
}
Light.prototype.init = function () {
let button = document.createElement('button');
self = this;
this.button = document.body.appendChild(button);
this.button.innerHTML = '开关';
this.button.currState = this.offlightState;
this.button.onclick = function () {
self.currState.buttonPressed;
}
}
Light.prototype.setState = function (newState) {
this.currState = newState;
}
let light = new Light();
light.init();
以上代码实现了一个基本的状态模式,状态的切换规律事先被定义好在各个状态类中,主体上无需关心切换的细节。如果日后又新增了一个状态,那我们只要编写好新的状态类,加入到原有代码中就可以了。
2.状态模式的优缺点
(1)状态模式定义了状态与行为之间的关系,并将它们封装在一个类里。通过增加新的状态类,很容易增加新的状态和转换
(2)避免Context无限膨胀,状态切换的逻辑被分布在状态类中,也去掉了Context中原本过多的分支。
(3)用对象代替字符串来记录当前状态,使得状态的切换更加一目了然。
(4)Context中的请求动作和状态类中封装的行为可以非常容易地独立变化而互不影响。
3.状态模式中的性能优化点
(1)状态可以等待需要的时候再创建,也可以一开始就创建好,具体依据实际场景、
(2)state对象可以在多个类之间共享。
二、适配器模式
解决两个软件实体间接口不兼容问题
适配器模式的应用
let googleMap = {
show: function () {
console.log('开始渲染谷歌地图');
}
}
let baiduMap = {
show: function () {
console.log('开始渲染百度地图');
}
}
let renderMap = function (map) {
map.show();
}
/**
* 以上代码段实现了渲染不同地图的功能。现在假设BaiduMap的api改成了display,修改源代码势必不太符合开闭原则,这时候我们可以通过新建一个适配器来达到目的
*/
let baiduMapAdapter = {
show: function () {
return baiduMap.display();
}
}
renderMap(baiduMapAdapter);
来源:https://blog.csdn.net/weixin_49971653/article/details/126307466


猜你喜欢
- 由传智播客教程整理,我们这里使用的是python2.7.x版本,就是2.7之后的版本,因为python3的改动略大,我们这里不用它。现在我们
- 然而,微软sql server在处理这类索引时,有个重要的缺陷,那就是把本该编译成索引seek的操作编成了索引扫描,这可能导致严重性能下降
- 另外,还有一个很重 要的事情是,在Win32上,mouse move的事件不是一个连续的,也就是说,并不是我们每次移动1px的鼠标指针,就会
- 这篇文章主要介绍了微信小程序 云开发模糊查询实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 有时候我们需要程序截图文章中的部分字符作为摘要显示出来,这时我们一般是只希望提取的字符串是纯文本的,没有如何html标签,如果我们章节用le
- python 实现pacs功能 推送下拉影像dcmtk关联pacs技术笔记:简介1、dcmtk关联pacs的参数介绍2、dcmtk命令介绍3
- 缓动,学名为Tween,缓冲移动的简称。要想页面内容切换起来舒服,就使用淡入淡出特效,要想让页面元素动起来自然,就要使用缓动效果。这两个混合
- 一、关系型数据库设计规则遵循ER模型和三范式E entity 代表实体的意思 对应到数据库当中的一张表R relationship 代表关系
- 前言最近有文字转图片的需求,但是不太想下载 APP,就使用 Python Pillow 实现了一个,效果如下:PIL 提供了 PIL.Ima
- 一、创建元组tup1 = ('physics', 'chemistry', 1997, 2000);tup2
- LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每
- 数据插入覆盖和时间戳问题1.数据插入问题当我们insert数据时,插入datetime类型,此类型的字段,存储数据格式为: YY
- selenium关闭窗口有两个方法,close与quit,我们稍作研究便知道这两个方法的区别。1.看源码或API这是close()的说明:C
- 缩略图在很多时候我们都需要将图片按照同比例缩小有利于存储 但是一张张手动去改的话太麻烦了 今天我们就用python实现一个简单的将一个文件夹
- 本文记录了Linux系统(CentOS)安装Python,供大家参考,具体内容如下Python(Linux) 下载地址操作系统:Centos
- BIT[(M)]位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。TINYINT[(M)] [UNSIGNED]
- 注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColumns(一)行转列的方法先说说行转
- 前言在搜集了很多文本语料之后,会开始漫长的数据清洗过程,通常要不断迭代。1. 问题描述有些文本数据中,会包含一些特殊符号。猜想可能是从某些富
- 一、截取子串-切片方法:字符串名[初始位置:结束位置:步长]str1 = 'abcdefg'print(str1[:]) #
- 用window.open打开的窗口中,有时候session变量会丢掉,给asp编程带来的一定的麻烦。用参数传递解决它:<DIV&nbs