JavaScript设计模式--状态模式(TypeScript)学习

状态模式:

本文纯属自学阶段笔记:学习自各大网站
状态模式 隶属于 行为模式
模型:环境类(原始对象),状态类,无数子类
将具体执行逻辑放于子类中,主要不变的方法放在环境类中,状态类单纯用来管理状态

优点:
	避免使用多重条件判断
	扩展性良好
缺点:
	如果状态太多,会造成类太多,也会造成逻辑分散在各个类中,过于复杂

用途:在 TypeScript 语言中, 状态模式通常被用于将基于 switch语句的大型状态机转换为对象。
核心:让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样

话不多说,先上完整的实例

class FindGirlfriends {
    private state: State;
    constructor(state: State) {
        this.find(state);
    }
    public find(state: State) {
        console.log(`${state}来找女朋友了`);
        this.state = state;
        this.state.setFind(this);
    }

    public request(): void {
        this.state.findHandle();
    }
}

abstract class State {
    protected findGirlfriends: FindGirlfriends;
    public setFind(findGirlfriendsxt: FindGirlfriends) {
        this.findGirlfriends = findGirlfriendsxt;
    }
    public abstract findHandle(): void;
}

// 有对象的状态
class StateA extends State {
    public findHandle(): void {
        console.log('你已经有女朋友了,不能再找了');
        this.findGirlfriends.find(new StateA());
    }
}

// 没有对象的状态
class StateB extends State {
    public findHandle(): void {
        console.log('正在帮您找女朋友');
        this.findGirlfriends.find(new StateB());
    }
}

const findGirlfriends = new FindGirlfriends(new StateA);
findGirlfriends.request();

const findGirlfriends2 = new FindGirlfriends(new StateA);
findGirlfriends2.request();
// 环境类(原始对象)维护着指向状态类的实例引用
class Context {
	// 定义的state是State类型的,State的定义在状态类中
	private state:State; 
	
	constructor(state:State) {
		this.transitionTo(state);
	}
	public transitionTo(state:State):void {
		console.log();
		this.state = state;
		this.state.setContext(this);
	}
	public requestone():void {
		this.state.handleone();
	}
	public requesttwo():void {
		this.state.handletwo();
	}
}

标准模版:

// 抽象状态类
abstract class State {
	protected context: Context;
	public setContext(context:Context){
		this.context = context;
	}
	public abstract handleone():void;
	public abstract handletwo():void;
}
// 无数的子类
class ConcreteStateA extends State {
	public handleone():void {
		this.context.transitionTo(new ConcreteStateB());
	}
	public handle2(): void {
        console.log('小A处理请求2');
    }
}
class ConcreteStateB extends State {
    public handle1(): void {
        console.log('小B处理请求1');
    }

    public handle2(): void {
        console.log('小B处理请求2');
        console.log('小B期望更改上下文状态.');
        this.context.transitionTo(new ConcreteStateA());
    }
}
执行代码
const context = new Context(new ConcreteStateA());
context.requestone();
context.requesttwo();

参考:https://refactoringguru.cn/design-patterns/state

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值