js对象管理基于事件驱动

接上一篇,公司造了一栋大别野,大别野门口有个警报器,有个喷泉,还有个大灯。

var   fountain;

var  annunciator;

var  light;

需求:

警报器 喷泉  大灯 状态联动:

打开大灯时   警报器 关闭  喷泉打开

打开警报器时   大灯关闭   喷泉关闭

打开喷泉时   大灯打开  警报关闭

白天  大灯不能打开

=================

喷泉、灯、警报器的方法合计

fountainStrat();

fountainStop();

annunciatorStart();

annunciatorStop();

lightStart();

lightStop();

===================

此外还需要一个方法 判断是否为白天

isDay();

实现三者的联动,常规模式下,给每个对象添加start,stiop 方法,会比较麻烦,并且维护扩展性能较差,可以使用基于状态驱动。

我们先定义一个状态量:

var state:

三个对象的状态  根据 state来改变

新建统一入口函数

function sendMsg(state){

}

无论 灯,喷泉,警报器那个改变 都只改变  state  发送消息事件 sendMsg(state)

添加  灯,喷泉,警报器 控制器

changefountain(msg){

if(msg==true){ 

                      fountainStrat();

                     } else{

                      fountainStop();

                      }

}

changeannunciator(msg){

                  if(msg==true){

                        annunciatorStart();

                            } else{

                       annunciatorStop();

                          }

 }

changelight(msg){

                 if(msg==true){

                 lightStart();

                 } else{

               lightStop();

             }

}

改造 sendMsg()函数。

如下,

function sendMsg(state){

         changefountain(msg);

         changeannunciator(msg);

         changelight(msg);

}

基于状态的驱动,不论三个对象那个改变都只是改变状态值,状态值改变后,使用统一的函数发送状态值到控制器里。控制器根据状态做出响应。

这样的话要修改 联通效果只需要修改某一个控制器就可以,比如灯泡白天不亮在灯泡控制器中添加时间判断

changelight(msg){

        if(isDay()){

console.log('it's day time')

}else{

         if(msg==true){

           lightStart();

             } else{

                lightStop();

         }

   }

}

响应与事件分离。


若要添加或者删除一级关联的话  则去改造sendMsg

function sendMsg(state){

changefountain(msg);

changeannunciator(msg);

//changelight(msg);  // 注释掉灯光控制器 则灯光不在联动

}

想要控制灯 最晚时间加入联动 则只需要改变isDay()函数。

=======================

本文完成:没有最好的模式,只有最合适的模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值