【oop】状态模式
描述:状态模式主要用来在对象内部状态改变时改变它的行为,对象看起来好像修改了它的类;
主要解决:对象的行为依赖于它的状态,并且根据他状态的改变而改变它的相关行为;
何时使用:代码中包含大量与对象状态有关的条件语句
应用举例:上购物一件商品一般包括 商品加入购物车状态、商品被下订单状态、商品被配送中状态、商品交易完成状态,商品当前的状态决定了可以对商品的操作(加购物车、订单付款、确认收货、申请售后)
- 首先我们需要创建一个State类用来描述不同状态下表现出的不同行为,每个具体的状态会实现重写状态对应的相关行为,比如购物车状态就可以允许用户付款的操作、下单状态商品允许用户确认收货操作...
var aState = function () {};
aState.prototype.collect = function () {
throw new Error("抽象的_加入购物车操作!");
};
aState.prototype.payment = function () {
throw new Error("抽象的_订单付款操作!");
};
aState.prototype.take = function () {
throw new Error("抽象的_确认收货操作!");
};
aState.prototype.aftersale = function () {
throw new Error("抽象的_申请售后操作!");
};
- 然后在编写具体状态之前我们要先来编写一个作为商品最初状态的类,最初状态的商品只能执行被加入购物车操作,并用oCommodity来存储维护商品的状态
// 商品初始状态
var BaseCommodity = function (oCommodity) {
this.oCommodity = oCommodity;
};
BaseCommodity.prototype = new State();
BaseCommodity.prototype.collect = function () {
this.oCommodity.setState(this.oCommodity.getCollectState());
console.log("将商品加入购物车!");
};
BaseCommodity.prototype.payment = function () {
throw new Error("不能执行付款!");
};
BaseCommodity.prototype.take = function () {
throw new Error("不能确认收货!");
};
BaseCommodity.prototype.aftersale = function () {
throw new Error("不能申请售后!");
};
- 然后我们创建一个商品commodity函数,用于控制状态的改变和获取,这个对象的作用是使用对象中维护的oState对象执行对相应行为,以及对不同状态的获取能力
// 商品类
var Commodity = function () {
this.oState = new BaseCommodity(this);
};
Commodity.prototype.setState = function (oState) {
this.oState = oState;
};
// 对外暴露的四个公共方法,以便外部调用
Commodity.prototype.collect = function () {
this.oState.collect();
};
Commodity.prototype.payment = function () {
this.oState.payment();
};
Commodity.prototype.take = function () {
this.oState.take();
};
Commodity.prototype.aftersale = function () {
this.oState.aftersale();
};
//获取各种状态,传入当前this对象
Commodity.prototype.getCollectState = function () {
return new CollectState(this);
};
Commodity.prototype.getPaymentState = function () {
return new PaymentState(this);
};
Commodity.prototype.getTakeState = function () {
return new TakeState(this);
};
Commodity.prototype.getAftersaleState = function () {
return new AftersaleState(this);
};
- 接下来,我们就需要对每种具体的状态进行实现:
- 购物车状态,可以执行订单付款操作
var CollectState = function (oCommodity) {
this.oCommodity = oCommodity;
};
CollectState.prototype = new State();
CollectState.prototype.collect = function () {
throw new Error("商品已被加入购物车!");
};
CollectState.prototype.payment = function () {
this.oCommodity.setState(this.oCommodity.getPaymentState());
console.log("订单付款,商品进入配送状态!");
};
CollectState.prototype.take = function () {
throw new Error("无法进行确认收货操作");
};
CollectState.prototype.aftersale = function () {
throw new Error("无法进行售后服务操作");
};
- 已付款状态/商品运送中状态,可以执行确认收货操作
var PaymentState = function (oCommodity) {
this.oCommodity = oCommodity;
};
PaymentState.prototype = new State();
PaymentState.prototype.collect = function () {
throw new Error("商品配送中");
};
PaymentState.prototype.payment = function () {
throw new Error("商品配送中");
};
PaymentState.prototype.take = function () {
this.oCommodity.setState(this.oCommodity.getTakeState());
console.log("确认收货,商品状态变为已确认收货状态!");
};
PaymentState.prototype.aftersale = function () {
throw new Error("无法进行售后服务操作");
};
- 已确认收货状态,可以执行售后操作
var TakeState = function (oCommodity) {
this.oCommodity = oCommodity;
};
TakeState.prototype = new State();
TakeState.prototype.collect = function () {
throw new Error("商品已被签收");
};
TakeState.prototype.payment = function () {
throw new Error("商品已被签收");
};
TakeState.prototype.take = function () {
throw new Error("商品已被签收");
};
TakeState.prototype.aftersale = function () {
this.oCommodity.setState(this.oCommodity.getAftersaleState());
console.log("申请售后,商品状态变为申请售后状态!");
};
- 售后状态,不能执行任何操作
var AftersaleState = function (oCommodity) {
this.oCommodity = oCommodity;
};
AftersaleState.prototype = new State();
AftersaleState.prototype.collect = function () {
throw new Error("商品申请售后中");
};
AftersaleState.prototype.payment = function () {
throw new Error("商品申请售后中");
};
AftersaleState.prototype.take = function () {
throw new Error("商品申请售后中");
};
AftersaleState.prototype.aftersale = function () {
throw new Error("商品申请售后中");
};
- 最后使用:
var commodity = new Commodity (); //创建最初的商品 commodity.collect(); //加入购物车,商品变成购物车状态 commodity.payment(); //执行付款操作,商品变为已付款状态 commodity.take(); //执行确认收货操作,商品变为已确认收货状态 commodity.aftersale(); //执行申请售后操作,商品变为售后状态

浙公网安备 33010602011771号