设计模式(九)-状态模式

状态模式

允许一个对象或者类,在其内部状态修改时改变它的行为.

  • 图例
image.png
  • 普通代码示例
class Battery{
    constructor(){
        this.amount=100
        this.state='success'
    }
    show(){
        if(this.amount==100){
            console.log('显示绿色')
            this.state='success'
            this.amount=60
        }else if(this.amount==60){
            console.log('显示黄色')
            this.state='warning'
            this.amount=30
        }else{
            console.log('显示红色')
            this.state='danger'
            this.amount=10
        }
    }
}

let batter=new Battery()
batter.show() //显示绿色
batter.show()//显示黄色
batter.show()//显示红色
  • 状态模式优化版
//定义单独状态类,把显示的逻辑委托给了状态对象,内部还需要维护状态变化.
class SuccessState{
   constructor(batter){
      this.batter=batter  
   }
   show(){
       console.log('显示绿色')
       this.batter.amount=60
       return 'success'
   }
}

class WarningState{
    constructor(batter){
        this.batter=batter  
    }
    show(){
        console.log('显示黄色')
        this.batter.amount=30
        return 'warning'
    }
}
class DangerState{
    constructor(batter){
        this.batter=batter  
    }
    show(){
        console.log('显示红色')
        this.batter.amount=10
        return 'danger'
    }
}

class Battery{
    constructor(){
        this.amount=100
        this.state=new SuccessState(this)
    }
    show(){
        this.state.show()
        if(this.amount==100){
            this.state=new SuccessState(this)
        }else if(this.amount==60){
            this.state=new WarningState(this)
        }else{
            this.state=new DangerState(this)
        }
      }
}

let batter=new Battery()
batter.show() //显示绿色
batter.show()//显示黄色
batter.show()//显示红色
  • 使用场景
javascript-state-machine库
 const StateMachine=require('javascript-state-machine')
 var fsm = new StateMachine({
    init: 'solid',
    transitions: [
      { name: 'melt', from: 'solid', to: 'liquid' },
      { name: 'freeze', from: 'liquid', to: 'solid' },
      { name: 'vaporize', from: 'liquid', to: 'gas' },
      { name: 'condense', from: 'gas', to: 'liquid' }
    ],
    methods: {
      onMelt: function() { console.log('I melted')},
      onFreeze:  function() { console.log('I froze') },
      onVaporize: function() { console.log('I vaporized') },
      onCondense: function() { console.log('I condensed') }
    }
  });
fsm.freeze()
优点
1.封装了转换规则
2.将所有某个状态相关的行为放到一个类中,并可以方便的增加新的状态.
3.允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块.
4.可以让多个对象或者类共享一个状态对象.
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式专栏 设计模式专栏 1.定义: 当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来改变了其类 2...
    OneXzgj阅读 1,675评论 0 3
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,198评论 0 14
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,415评论 1 15
  • 学习并理解 23 种设计模式 设计模式 Design Pattern 是一套被反复使用、多数人知晓的、经过分类编目...
    Code_Narrator阅读 4,756评论 0 1
  • 状态模式 State Pattern 定义:运行对象内部因为状态发生改变时,改变其行为操作。 主要解决:对象的行为...
    sssssss_阅读 2,490评论 0 1

友情链接更多精彩内容