JavaScript状态模式及适配器模式使用讲解

作者:volit_ 时间:2024-04-19 10:14:05 

一、状态模式

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类

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

标签:JavaScript,状态模式,适配器模式
0
投稿

猜你喜欢

  • 如何更优雅地写python代码

    2022-03-03 04:53:24
  • 解决python中画图时x,y轴名称出现中文乱码的问题

    2023-08-04 09:00:23
  • 如何基于Python实现word文档重新排版

    2023-06-09 11:19:24
  • python3.5 email实现发送邮件功能

    2023-06-14 15:58:59
  • python基于pygame实现飞机大作战小游戏

    2021-04-27 07:59:17
  • Python调用shell命令常用方法(4种)

    2021-05-06 08:22:06
  • Go语言函数学习教程

    2024-02-22 14:17:41
  • 从web到内网渗透的一次过程详解

    2023-05-20 21:23:08
  • JS获取对象代码总结

    2011-03-07 16:14:00
  • python 接收处理外带的参数方法

    2022-05-01 17:56:26
  • python并发编程之多进程、多线程、异步和协程详解

    2021-12-10 00:20:35
  • PyTorch上搭建简单神经网络实现回归和分类的示例

    2022-08-02 04:49:42
  • Python读取指定日期邮件的实例

    2023-05-28 17:20:01
  • Django 路由层URLconf的实现

    2021-01-18 17:05:13
  • Python中的异常处理相关语句基础学习笔记

    2021-10-18 00:54:50
  • Python 实现「食行生鲜」签到领积分功能

    2023-02-25 16:26:00
  • Pytorch中DataLoader的使用方法详解

    2023-07-19 04:45:39
  • 整理及优化CSS代码的七个原则[译]

    2009-04-23 12:35:00
  • javaScript通用数据类型校验函数

    2009-07-06 12:49:00
  • Python实现简单的多任务mysql转xml的方法

    2024-01-26 20:11:07
  • asp之家 网络编程 m.aspxhome.com