JavaScript设计模式_13_状态模式

状态模式是一种根据事物内部状态的改变,从而改变事物行为的一种模式。

/**
 * pre:状态模式
 */
//---------- 示例1 ----------------
/**
 * 模拟电灯开关
 */
var Light = function() {
    this.state = "off";
    this.button = null;
};
Light.prototype.init = function() {
    var button = document.createElement("button");
    var _self = this;
    button.innerHTML = "开关";
    this.button = document.body.appendChild(button);
    this.button.onclick = function() {
        _self.buttonWasPressed();
    };
};
Light.prototype.buttonWasPressed = function() {
    var _self = this;
    var onEvent = function() {
        _self.state = "on";
        console.log("开灯");
    };
    var offEvent = function() {
        _self.state = "off";
        console.log("关灯");
    };
    var operations = {
        "off": onEvent,
        "on": offEvent
    }
    return operations[_self.state]();
};
var light = new Light();
light.init();
//----------- 示例2 --------
/**
 * [分析]:有另外一种电灯,按一次打开弱光,按两次打开强光,按三次关闭电灯。
 * 实现这一功能,我们需要对buttonWasPressed方法内部进行改造,增加另外一种状态事件。
 * 试想,如果在程序中,有N多种状态的切换,我们是不是要定义N多种状态,以及每种状态切换所发生的事件。
 * 若其中一个状态发生改变,还得去修改buttonWasPressed方法,使得复用性和可维护性大大降低。
 * 使用状态模式改写代码:
 */
var offLightState = function(light) {
    this.light = light;
};
offLightState.prototype.buttonWasPressed = function() {
    console.log("弱光");
    this.light.setCurrentState(this.light.weakLightState);
};
var weakLightState = function(light) {
    this.light = light;
};
weakLightState.prototype.buttonWasPressed = function() {
    console.log("强光");
    this.light.setCurrentState(this.light.strongLightState);
};
var strongLightState = function(light) {
    this.light = light;
};
strongLightState.prototype.buttonWasPressed = function() {
    console.log("超级强光");
    this.light.setCurrentState(this.light.superStrongLightState);
};
var superStrongLightState = function(light) {
    this.light = light;
};
superStrongLightState.prototype.buttonWasPressed = function() {
    console.log("关灯");
    this.light.setCurrentState(this.light.offLightState);
};
var Light = function() {
    this.offLightState = new offLightState(this);
    this.weakLightState = new weakLightState(this);
    this.strongLightState = new strongLightState(this);
    this.superStrongLightState = new superStrongLightState(this);
    this.currentState = null; // 当前状态
    this.button = null; // 开关
};
Light.prototype.setCurrentState = function(state) {
    this.currentState = state;
};
Light.prototype.init = function() {
    var _self = this;
    var button = document.createElement("button");
    button.innerHTML = "开关";
    this.button = document.body.appendChild(button);
    this.currentState = this.offLightState;
    this.button.onclick = function() {
        _self.currentState.buttonWasPressed();
    };
};
var light = new Light();
light.init();
//---------------- 示例3 ----------------
/**
 * 使用对象字面量重写
 */
var Light = function() {
    this.currentState = FSM.off;
    this.button = null;
};
var FSM = {
    "off": {
        buttonWasPressed: function() {
            console.log("弱光");
            this.currentState = FSM.weak;
        }
    },
    "weak": {
        buttonWasPressed: function() {
            console.log("强光");
            this.currentState = FSM.strong;
        }
    },
    "strong": {
        buttonWasPressed: function() {
            console.log("关灯");
            this.currentState = FSM.off;
        }
    }
};
Light.prototype.init = function() {
    var _self = this;
    var button = document.createElement("button");
    button.innerHTML = "开关";
    this.button = document.body.appendChild(button);
    this.button.onclick = function() {
        _self.currentState.buttonWasPressed.call(_self);
    };
};
var light = new Light();
light.init();
//------------- 示例4 --------------
/**
 * 使用委托进行重写
 */
var delegate = function(client, delegation) {
    return {
        "buttonWasPressed": function() {
            delegation.buttonWasPressed.apply(client, arguments);
        }
    };
};
var Light = function() {
    this.button = null;
    this.offLightState = delegate(this, FSM.off);
    this.weakLightState = delegate(this, FSM.weak);
    this.strongLightState = delegate(this, FSM.strong);
    this.currentState = this.offLightState;
};
var FSM = {
    "off": {
        "buttonWasPressed": function() {
            console.log("弱光");
            this.currentState = this.weakLightState;
        }
    },
    "weak": {
        "buttonWasPressed": function() {
            console.log("强光");
            this.currentState = this.strongLightState;
        }
    },
    "strong": {
        "buttonWasPressed": function() {
            console.log("关灯");
            this.currentState = this.offLightState;
        }
    }
};
Light.prototype.init = function() {
    var _self = this;
    var button = document.createElement("button");
    button.innerHTML = "开关";
    this.button = document.body.appendChild(button);
    this.button.onclick = function() {
        _self.currentState.buttonWasPressed.call(_self);
    };
}
var light = new Light();
light.init();

作者:『Stinchan』

出处:http://www.cnblogs.com/stinchan/p/7065432.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

时间: 2024-08-29 09:29:27

JavaScript设计模式_13_状态模式的相关文章

软考总结— 设计模式之状态模式

软考在即,针对下午题的设计模式,本人有觉得有必要从考试战略上稍微做一些总结.为什么呢?一方面设计模式只要掌握好做题技巧,还是比较好拿分的.另一方面,通过这次软考又进一步的学习设计模式,而且在题目中给出的设计模式都是在项目中很好的应用. 一开始做题,没有全局观.俗话说的好"不谋全局者不足谋一域",不管做什么事,先在战略方向上把握好了,采取什么样的战术,都不成什么问题了.所以考试也是一样.下面这道题就很典型:   [题目] 某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,

设计模式之状态模式

<设计模式>对状态模式的定义:允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类.别名:状态对象(Objects for State). 在下面两种情况下均可以使用State模式: 1 一个对象的行为取决于它的状态,并且他必须在运行时刻根据状态改变它的行为. 2 一个操作中含有庞大的多分枝的条件语句,并且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常,有多个操作包含这一相同的条件结构.State模式将每一个条件分支放入一个独立的类中.这是得你可以根据对

JAVA设计模式之 状态模式【State Pattern】

一.概述 当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化.状态模式是一种对象行为型模式. 二.适用场景 用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题.简单说就是处理对象的多种状态及其相互转换. 三.UML类图 四.参与者 1>.AbstractState(抽象状态类): 在抽象状态类中定义申明了不同状态下的行为抽象方法,而由子类

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

设计模式之状态模式20170712

行为型设计模式之状态模式: 一.含义 为每个状态创建与之对应的类(对应的每个类实现同一个接口或继承同一个抽象类,便于统一处理),并且再通过一个类切换状态 二.代码说明 1.一般包含三个角色抽象状态角色,具体状态角色,以及环境(上下文)角色(负责具体状态的切换). 具体步骤: 1)定义环境角色,并初始化状态 2)通过环境角色执行行为,同时也就是对应状态的行为被执行 3)对应状态的行为的执行分为两种情况: I.对应状态对应行为执行后,环境角色继续执行行为,调用的还是此状态,此状态的下一个行为(下一状

【设计模式】状态模式 改进后的

1.简单谈谈 状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类. 状态模式要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 优点:简化了一个对象的状态转换和行为改变的代码,把这部分代码放在了[状态类]中,需要注意的一点是:在[状态类]中,每个不同的[状态值]也许会被“串起来”成为一条链,这样就能保证设置不同的“离散的”[状态值]时,可以在“链上”有有个对应的处理(行为).

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【javascript设计模式】构造器模式、模块模式、单例模式

构造器模式(Constructor) 构造器模式是学习js最早接触的一种,实现主要如下: 1 function myObject(name){ 2 this.name = name; 3 } 4 5 myObect.propotype = function sayName(){ 6 alert(this.name); 7 } 使用的时候需要new一个对象. 1 var myObj = new myObject('hello'); 2 myObj.sayName(); 模块模式(Module) 模

大话设计模式之----状态模式

<?php    #状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类.    //抽象状态    abstract class State{        public $w;        abstract function WriteProgram($w);    }        //上午和中午工作状态类    class ForenoonState extends State{        function WriteProgram($w){