状态模式:
本文纯属自学阶段笔记:学习自各大网站
状态模式 隶属于 行为模式
模型:环境类(原始对象),状态类,无数子类
将具体执行逻辑放于子类中,主要不变的方法放在环境类中,状态类单纯用来管理状态
优点:
避免使用多重条件判断
扩展性良好
缺点:
如果状态太多,会造成类太多,也会造成逻辑分散在各个类中,过于复杂
用途:在 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