关于状态切换

关于发布框的状态切换问题, 我的实现思路是利用状态机.

每个状态都是一个独立的对象,然后创建一个状态机来保存当前状态.每次状态发生改变的时候,就检查是不是等于当前状态, 如果不是就当前状态Close掉, 然后将改变的状态设置为当前状态, 代码如下:

 

		/*状态机*/
var statusMachine = function(item) {
	this.prevStatus = item || null;//设置初始状态
};

statusMachine.prototype = {
	init: function() {
		var _this = this;
	},
	change: function(status) {
                 //检测状态是否存在, 如果存在判断是否等于当前状态
		if (this.prevStatus && this.prevStatus.id != status.id) {
			this.prevStatus.close(); //关闭当前状态
		}

		this.prevStatus = status; //设置状态
		this.prevStatus.show(); //开启当前状态
	},
	close: function() {
		if (this.prevStatus) {
			this.prevStatus.close();
			this.prevStatus = null;
		}
	}
};

var status = new statusMachine();
/*图片状态*/
var image = {
	id: 'image',
	init: function(){			
		var _this = this;
		
		this.ui = {};
		this.ui.img = $('imgBox');
		this.ui.btnOpen = $('#imgOpen');
		
		
		
		this.ui.btnOpen = function(){
			status.change(_this); //切换状态					
		};
	},
	show: function(){
		this.ui.img.show();
	},
	close: function(){
		this.ui.img.hide();
	}
};

/*视频状态*/
var video = {
	id: 'video',
	init: function(){			
		var _this = this;
		
		this.ui = {};
		this.ui.video = $('imgvideo');
		this.ui.btnOpen = $('#videoOpen');
		
		this.ui.btnOpen = function(){
			status.change(_this);//切换状态
		};
	},
	show: function(){
		this.ui.video.show();
	},
	close: function(){
		this.ui.video.hide();
	}
};

  

 

总结:

  1.每个状态都是独立的, 不需要去关注其它状态, 所以怎么改变都不会影响到其它的状态.

      2.可以无限扩展和缩减, 即使增加和减少状态也不会影响到其它状态的运行.

 

posted @ 2013-12-06 17:32  火柴人  Views(263)  Comments(0Edit  收藏  举报