接上一篇,公司造了一栋大别野,大别野门口有个警报器,有个喷泉,还有个大灯。
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()函数。
=======================
本文完成:没有最好的模式,只有最合适的模式。