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

 更新时间:2022年12月30日 10:15:49   作者:volit_  
这篇文章主要介绍了理解JavaScript中的状态模式及适配器模式,适配器模式即Adapter Pattern,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,下文更多相关介绍需要的小伙伴可以参考一下

一、状态模式

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

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);

到此这篇关于JavaScript状态模式及适配器模式使用讲解的文章就介绍到这了,更多相关JavaScript状态模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript中验证大写字母、数字和中文

    javascript中验证大写字母、数字和中文

    本文为大家介绍下使用javascript验证大写字母小写字母,数字和中文,具体示例如下
    2014-01-01
  • js 数组倒序排列的具体实现

    js 数组倒序排列的具体实现

    有时候需要将数组类型变量内的元素颠倒一下顺序再输出,本文就详细的介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • js前端登录加密解决方案

    js前端登录加密解决方案

    项目中需要前端书写登录页面,用户输入账号密码,本文主要介绍了js前端登录加密解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 基于JavaScript实现百度搜索框效果

    基于JavaScript实现百度搜索框效果

    这篇文章主要为大家详细介绍了基于JavaScript实现百度搜索框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • js跑马灯代码(自写)

    js跑马灯代码(自写)

    自己刚写的一个小程序,写得满一般的,不过这个接口还成,感兴趣的朋友可以参考下哈,希望对你学习js知识有所帮助
    2013-04-04
  • javascript 设为首页与加入收藏兼容多浏览器代码

    javascript 设为首页与加入收藏兼容多浏览器代码

    javascript 设为首页与加入收藏兼容多浏览器代码,不过由于ie7的特殊性,设为首页不能使用,不过其它基于ie内核的浏览器都是支持的。
    2011-01-01
  • js里怎么取select标签里的值并修改

    js里怎么取select标签里的值并修改

    js如何将select标签里的BBB改成XXX,同时BBB里的valued的值改成F?本文将告诉你正确的答案
    2012-12-12
  • 让多个输入框中的内容同时变化的js代码

    让多个输入框中的内容同时变化的js代码

    怎么样让多个输入框中的内容同时变化?一般又要兼容IE与firefox
    2010-01-01
  • JS无限级导航菜单实现方法

    JS无限级导航菜单实现方法

    今天小编就为大家分享一篇关于JS无限级导航菜单实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • JavaScript DOM 学习总结(五)

    JavaScript DOM 学习总结(五)

    当页面加载时,浏览器会创建页面的文档对象模型(Document Object Model)。文档对象模型定义访问和处理HTML文档的标准方法,本篇文章给大家介绍javascript dom 学习总结(五),感兴趣的朋友一起学习吧
    2015-11-11

最新评论