深入理解深入理解JavaScript系列(系列(43):设计模式之状态模式详解):设计模式之状态模式详解
主要介绍了深入理解JavaScript系列(43):设计模式之状态模式详解,状态模式(State)允许一个对象在其内
部状态改变的时候改变它的行为,对象看起来似乎修改了它的类,需要的朋友可以参考下
介绍介绍
状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。
正文正文
举个例子,就比如我们平时在下载东西,通常就会有好几个状态,比如准备状态(ReadyState)、下载状态
(DownloadingState)、暂停状态(DownloadPausedState)、下载完毕状态(DownloadedState)、失败状态
(DownloadFailedState),也就是说在每个状态都只可以做当前状态才可以做的事情,而不能做其它状态能做的事儿。
由于State模式描述了下载(Download)如何在每一种状态下表现出不同的行为。这一模式的关键思想就是引入了一个叫做
State的抽象类(或JS里的函数)来表示下载状态,State函数(作为原型)为每个状态的子类(继承函数)声明了一些公共接
口。其每个继承函数实现与特定状态相关的行为,比如DownloadingState和DownloadedState分别实现了正在下载和下载完毕
的行为。这些行为可以通过Download来来维护。
让我们来实现一把,首先定义作为其他基础函数的原型的State函数:
复制代码 代码如下:
var State = function () {
};
State.prototype.download = function () {
throw new Error("该方法必须被重载!");
};
State.prototype.pause = function () {
throw new Error("该方法必须被重载!");
};
State.prototype.fail = function () {
throw new Error("该方法必须被重载!");
};
State.prototype.finish = function () {
throw new Error("该方法必须被重载!");
};
我们为State的原型定义了4个方法接口,分别对应着下载(download)、暂停(pause)、失败(fail)、结束(finish)以便
子函数可以重写。
在编写子函数之前,我们先来编写一个ReadyState函数,以便可以将状态传递给第一个download状态:
复制代码 代码如下:
var ReadyState = function (oDownload) {
State.apply(this);
this.oDownload = oDownload;
};
ReadyState.prototype = new State();
ReadyState.prototype.download = function () {
this.oDownload.setState(this.oDownload.getDownloadingState());
// Ready以后,可以开始下载,所以设置了Download函数里的状态获取方法
console.log("Start Download!");
};
ReadyState.prototype.pause = function () {
throw new Error("还没开始下载,不能暂停!");
};
ReadyState.prototype.fail = function () {
评论0
最新资源