前端读者 | Javascript设计模式理论与实战:状态模式
本文来自 @狼狼的蓝胖子;链接:http://luopq.com/2015/11/25/design-pattern-state/
在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将其抽象出来称为状态,我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理。状态模式就是一种适合多种状态场景下的设计模式。使用状态模式可以可以让代码更加清晰,提高应用程序的维护性和扩展性。
基础知识
状态模式定义一个对象,这个对象可以通过管理其状态从而使得应用程序作出相应的变化。状态模式是一个非常常用的设计模式,它主要有两个角色组成:
- 环境类:拥有一个状态成员,可以修改其状态并作出相应反应。
 - 状态类:表示一种状态,包含其相应的处理方法
 
状态模式的实现
基本示例
我们简单地通过一个红绿灯的例子来说明状态模式,红绿灯拥有一个状态:哪一种颜色的灯亮了,每一种颜色的灯亮了之后又各自的动作,一共有红绿黄三种颜色的灯,也就是有三种状态。
首先,需要一个最基本的红绿灯对象,我们定义如下:
var trafficLight = (function () {
    var currentLight = null;
    return {
        change: function (light) {
            currentLight = light;
            currentLight.go();
        }
    }
 })();
上面的代码中,trafficLight是一个红绿灯对象,它有一个局部变量currentLight表示当前亮灯的对象,同时返回一个方法,这个方法用来改变红绿灯的状态,并触发相应的处理程序。
接着我们定义三种不同颜色的灯,代码如下:
//红灯
function RedLight() { }
RedLight.prototype.go = function () {
    console.log("this is red light");
}
//绿灯
function GreenLight() { }
GreenLight.prototype.go = function () {
    console.log("this is green light");
}
//黄灯
function YellowLight() { }
YellowLight.prototype.go = function () {
    console.log("this is yellow light");
}
这段代码分别定义了红绿黄三种颜色的灯对象,每一个对象都包含一个go方法作为亮灯之后的处理程序。
接着,我们在客户端进行切换不同颜色的灯:
trafficLight.change(new RedLight());
trafficLight.change(new YellowLight());
通过传入灯对象到change方法中,从而改变红绿灯的状态,触发其相应的处理程序,这就是一个典型的状态模式的应用。
JS组件开发中的状态模式
状态模式在开发JS组件时非常有用,我们平时开发组件时很多时候要切换组件的状态,每种状态有不同的处理方式,这个时候就可以使用状态模式进行开发
比如我们要开发一个菜单组件,菜单拥有最基本的两种状态:显示和隐藏,相应的显示或隐藏可能会有各自的其他操作。使用状态模式的话,我们首先定义一个环境类,在这里也就是菜单对象,简单地定义如下:
function Menu() { }
Menu.prototype.toggle = function (state) {
    state();
}
这个菜单类有一个toggle方法用来切换状态,然后调用相应的处理方法。
接着我们定义两种状态,定义如下:
var menuStates = {
    "show": function () {
        console.log("the menu is showing");
    },
    "hide": function () {
        console.log("the menu is hiding");
    }
};
在这里,通过一个对象menuStates来定义menu的状态,这里有两种状态show和hide,然后拥有相应的处理方法。在使用的时候通过下面的方法进行调用:
var menu = new Menu();
menu.toggle(menuStates.show);
menu.toggle(menuStates.hide);
这段代码实例化了一个Menu对象,然后分别切换了显示和隐藏两种状态,如果有第三种状态,我们只需要menuStates添加相应的状态和处理程序即可。
总结
状态模式在开发Web组件时非常有用,能让我们的代码结构更加清晰,能够很方便的增加组件的各种状态。使用状态模式的关键是要理清组件的各种状态,搞清楚组件的不同状态和相应的处理函数,对组件后期的维护和扩展有极大的好处。
前端读者 | Javascript设计模式理论与实战:状态模式的更多相关文章
- Javascript设计模式理论与实战:工厂方法模式
		
本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...
 - Javascript设计模式理论与实战:状态模式
		
在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将其抽象出来称为状态,我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理.状态模式就是一种适合多种状态场景下的设计模式 ...
 - Javascript设计模式之我见:状态模式
		
大家好!本文介绍状态模式及其在Javascript中的应用. 模式介绍 定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是控制一个对象状态的条件表达式 ...
 - Javascript设计模式理论与实战:单例模式
		
在Javascript中,单例模式是一种最基本又经常用到的设计模式,可能在不经意间就用到了单例模式. 本文将从最基础的理论开始,讲述单例模式的基本概念和实现,最后用一个例子来讲述单例模式的应用. 理论 ...
 - Javascript设计模式理论与实战:观察者模式
		
观察者模式主要应用于对象之间一对多的依赖关系,当一个对象发生改变时,多个对该对象有依赖的其他对象也会跟着做出相应改变,这就非常适合用观察者模式来实现.使用观察者模式可以根据需要增加或删除对象,解决一对 ...
 - Javascript设计模式理论与实战:桥接模式
		
桥接模式将抽象部分与实现部分分离开来,使两者都可以独立的变化,并且可以一起和谐地工作.抽象部分和实现部分都可以独立的变化而不会互相影响,降低了代码的耦合性,提高了代码的扩展性. 基本理论 桥接模式定义 ...
 - Javascript设计模式理论与实战:适配器模式
		
有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器, ...
 - Javascript设计模式理论与实战:简单工厂模式
		
通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...
 - Javascript设计模式理论与实战:享元模式
		
享元模式不同于一般的设计模式,它主要用来优化程序的性能,它最适合解决大量类似的对象而产生的性能问题.享元模式通过分析应用程序的对象,将其解析为内在数据和外在数据,减少对象的数量,从而提高应用程序的性能 ...
 
随机推荐
- HDU1078记忆化搜索
			
FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
 - Java中JAVA_HOME与CLASSPATH的解析(转)
			
很多人在初学Java的时候经常会被书中介绍的一堆环境变量的设置搞得头昏脑胀,很多书中都会在初装JDK的时候让他大家设置JAVA_HOME环境变量,在开发程序的时候设置CLASSPATH环境变量,而很多 ...
 - vs报错“以下文件中的行尾不一致,是否将行尾标准化”
			
vs报错"以下文件中的行尾不一致,是否将行尾标准化" 分析: 通过读取源文件,发现换行都使用的是"\n" Windows和Unix不同的标准引起的...即& ...
 - 多条select语句的合并
			
select (') , (') , (select max(ssq) from DW_MARK_FXJS.F_GS_YCXJJDCSY@new_zgxt ) from dual 这样就不用傻傻的执行 ...
 - mysql  压缩包免安装版 安转步骤
			
一. 下载 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本 ...
 - 洛谷 P3709 大爷的字符串题
			
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
 - dp,状压dp等 一些总结
			
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...
 - centos6.8配置FTP普通用户除了家目录外还能访问其他目录
			
今天有个需求,使用ftp服务搭建一个文件共享服务器,每个普通用户除了能访问自己家目录的东西,还能访问一个公共的目录.配置步骤如下: 环境如下: 创建用户并配置密码(使用默认家目录/home) user ...
 - 阿里云服务器部署笔记二(python3、Flask、uWSGI、Nginx)
			
从git上把项目拉到服务器,项目可以在服务器上运行后,就只需要配置uwsgi和nginx了.它们的逻辑关系是:外部请求->nginx->uwsgi->项目实例. 一.配置uwsgi ...
 - 时间盲注脚本.py
			
时间盲注脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import time payloads = 'abcdefg ...