前言
状态模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
状态模式
使用场景:需要多种状态切换,并且状态的功能接口类似时,就可以使用这种模式了,比如 红黄绿灯的切换、空调制冷、制热、通风的切换。
理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。纯状态模式,在操作类中对所有状态进行汇总,在某个状态类中去设置将要切换的下一个状态。
namespace action_mode_05_2 {
// 接口
interface IShowLight {
lightPole: LightPole
showLight(): void
}
// 绿灯
class GreenLight implements IShowLight {
lightPole: LightPole;
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
showLight(): void {
console.log('绿灯亮,前方通行')
// 这里面其实可以加一些判断,比如出现异常时,直接切换到红灯等等
this.lightPole.setState(this.lightPole.yellowLight)
}
}
// 黄灯
class YellowLight implements IShowLight {
lightPole: LightPole;
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
showLight(): void {
console.log('黄灯亮,注意车俩')
this.lightPole.setState(this.lightPole.redLight)
}
}
// 红灯
class RedLight implements IShowLight {
lightPole: LightPole;
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
showLight(): void {
console.log('红灯亮,禁止通行')
this.lightPole.setState(this.lightPole.greenLight)
}
}
// 操作类:控制内部状态的切换
class LightPole {
greenLight: GreenLight;
yellowLight: YellowLight;
redLight: RedLight;
private currentState: IShowLight;
stateChangeNum: number = 0
constructor() {
this.greenLight = new GreenLight(this)
this.yellowLight = new YellowLight(this)
this.redLight = new RedLight(this)
this.currentState = this.greenLight
}
change() {
this.currentState.showLight()
}
setState(state: IShowLight) {
this.currentState = state
}
}
// 使用
const lightPole = new LightPole()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
}
状态模式结合职责链模式
理解:这里的状态模式结合了职责链模式,将类、对象的行为和使用解耦了,默认情况下就是按照顺序切换状态,但是并不影响在状态类中去修改之前的顺序,也不会影响状态类之外强行变更状态。我觉得是一个很好的模式结合。
namespace action_mode_05 {
// 接口
interface IShowLight {
lightPole: LightPole
nextShowLight: IShowLight
showLight(): void
setNextShowLight(nextShowLight: IShowLight): IShowLight
}
// 绿灯
class GreenLight implements IShowLight {
lightPole: LightPole;
nextShowLight!: IShowLight
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
setNextShowLight(nextShowLight: IShowLight) {
this.nextShowLight = nextShowLight
return nextShowLight
}
showLight(): void {
if (this.nextShowLight) {
console.log('绿灯亮,前方通行')
this.lightPole.setState(this.nextShowLight)
} else {
console.log('状态异常,完犊子了')
}
}
}
// 黄灯
class YellowLight implements IShowLight {
lightPole: LightPole;
nextShowLight!: IShowLight
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
setNextShowLight(nextShowLight: IShowLight) {
this.nextShowLight = nextShowLight
return nextShowLight
}
showLight(): void {
if (this.nextShowLight) {
console.log('黄灯亮,注意车俩')
this.lightPole.setState(this.nextShowLight)
} else {
console.log('状态异常,完犊子了')
}
}
}
// 红灯
class RedLight implements IShowLight {
lightPole: LightPole;
nextShowLight!: IShowLight
constructor(lightPole: LightPole) {
this.lightPole = lightPole
}
setNextShowLight(nextShowLight: IShowLight) {
this.nextShowLight = nextShowLight
return nextShowLight
}
showLight(): void {
if (this.nextShowLight) {
console.log('红灯亮,禁止通行')
this.lightPole.setState(this.nextShowLight)
} else {
console.log('状态异常,完犊子了')
}
}
}
// 操作类:控制内部状态的切换
class LightPole {
greenLight: GreenLight;
yellowLight: YellowLight;
redLight: RedLight;
currentState: IShowLight;
constructor() {
this.greenLight = new GreenLight(this)
this.yellowLight = new YellowLight(this)
this.redLight = new RedLight(this)
this.currentState = this.greenLight
// 设置状态切换的链条,在操作类内部设置
this.currentState
.setNextShowLight(this.yellowLight)
.setNextShowLight(this.redLight)
.setNextShowLight(this.greenLight)
}
change() {
this.currentState.showLight()
}
setState(state: IShowLight) {
this.currentState = state
}
}
// 使用
const lightPole = new LightPole()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
lightPole.change()
}