码迷,mamicode.com
首页 > 编程语言 > 详细

状态模式全解析--JavaScript

时间:2017-05-09 13:54:29      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:java   style   cto   使用   开始   htm   --   else   tor   

1 初级电灯例子 , 状态仅仅用字符串表示,没有封装到对象

class Light{
    constructor(){
        this.state = off;
        let button = document.createElement( button );
        button.innerHTML = 开关;
        this.button = document.body.appendChild( button );
        this.button.onclick = ()=>{
            this.buttonWasPressed();
        }
    }
    buttonWasPressed(){
        if ( this.state === off ){
            console.log( 开灯 );
            this.state = on;
        }else if ( this.state === on ){
            console.log( 关灯 );
            this.state = off;
        }
    }

}
new Light();

//  状态模式----面向对象版本

  实现的关键

  1 状态用对象表示

  2 状态对应的行为 抽象成一个统一的方法(buttonWasPressed),可以实现委托。这个行为可以放到状态类里,也可以放到context里,

  3 状态内部 会自己修改当前的状态,(也就是下一个状态是什么,在每一个状态对象内部已经明确,)

  4 当触发操作开始时,会用当前状态调用当前状态对应的行为,从而成功避免了使用丑陋的if else 分支,

 1 class State{
 2     buttonWasPressed(){
 3         throw new Error( ‘父类的 buttonWasPressed 方法必须被重写‘ )
 4     }
 5 }
 6 
 7 class StrongLightState extends State{
 8     constructor(light){
 9         super();
10         this.light = light
11     }
12     // buttonWasPressed(){
13     //     console.log(‘-->关灯‘);
14     //     this.light.setState(this.light.offLightState)
15     // }
16 }
17 
18 class OffLightState  extends State{
19     constructor(light){
20         super();
21         this.light = light
22     }
23     buttonWasPressed(){
24         console.log(‘-->弱光‘);
25         this.light.setState(this.light.weakLightState)
26     }
27 }
28 
29 class WeakLightState  extends State{
30     constructor(light){
31         super();
32         this.light = light
33     }
34     buttonWasPressed(){
35         console.log(‘-->强光‘);
36         this.light.setState(this.light.strongLightState)
37     }
38 }
39 
40 class  Light{
41     constructor(){
42         this.strongLightState = new StrongLightState(this);
43         this.offLightState = new OffLightState(this);
44         this.weakLightState = new WeakLightState(this);
45         this.currState = this.offLightState; // 设置当前状态
46 
47         let button = document.createElement( ‘button‘ );
48         button.innerHTML = ‘开关‘;
49         this.button = document.body.appendChild( button );
50         this.button.onclick = ()=>{
51             this.currState.buttonWasPressed();
52         }
53     }
54 
55     setState(newState){
56         this.currState = newState
57     }
58 }

 

状态模式全解析--JavaScript

标签:java   style   cto   使用   开始   htm   --   else   tor   

原文地址:http://www.cnblogs.com/WhiteHorseIsNotHorse/p/6830019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!