二、代码实战状态机模式:允许一个对象在其内部状态发生改变时,改变其行为。状态决定行为。下面通过一个饮水机的制冷、制热模式的切换来描述一下状态机模式
/**
* 状态模式:状态模式允许一个对象的状态改变时,改变其自身的行为
* 状态模式的具体表现:
* 1.状态决定行为,对象的行为由内部状态决定的
* 2.对象的状态在运行期间被改变时,它的行为也因此改变
*
* 下面通过饮水机的实例来模仿状态模式
* 场景如下:在这个炎热的夏季,办公室的小伙伴基本上都需要喝点冷水,早上一起来就会把饮水机调整为制冷模式,但是张三有一个吃泡面的习惯,他想吃
* 泡面的时候就会把饮水机调整为制热模式,所以他每次吃泡面,下一个同时都需要把模式调整为制冷,最后下班,李四就会关闭饮水机电源。
* Created by yangwei on 2020/8/4.
*/
sealed class WaterMachineState(open val machine: WaterMachine) {
fun trunHeating() {
if (this !is Heating) {
println("运行制热")
machine.state = machine.heating
} else {
println("this state is already heating mode")
}
}
fun trunCooling() {
if (this !is Cooling) {
println("运行制冷")
machine.state = machine.cooling
} else {
println("this state is alrready cooling mode")
}
}
fun trunOff() {
if (this !is Off) {
println("关闭饮水机")
machine.state = machine.off
} else {
println("this state is already off")
}
}
/**
* 开关
*/
class Off(override val machine: WaterMachine) : WaterMachineState(machine) {
}
/**
* 制热
*/
class Heating(override val machine: WaterMachine) : WaterMachineState(machine) {
}
/**
* 制冷
*/
class Cooling(override val machine: WaterMachine) : WaterMachineState(machine) {
}
}
class WaterMachine {
var state: WaterMachineState
val off = WaterMachineState.Off(this)
val heating = WaterMachineState.Heating(this)
val cooling = WaterMachineState.Cooling(this)
init {
this.state = off
}
/**
* 运行制热
*/
fun trunHeating() {
this.state.trunHeating()
}
/**
* 运行制冷
*/
fun trunCooling() {
this.state.trunCooling()
}
/**
* 关闭饮水机
*/
fun trunOff() {
this.state.trunOff()
}
enum class Moment {
EARLY_MOMENT, //早上上班
DRINKING_WATER, //日常饮水
INSTANCE_NOODLES, //泡面
AFTER_WORK//下班
}
/**
* 操作饮水机方法
*/
fun waterMachineOps(machine: WaterMachine, moment: Moment) {
when (moment) {
Moment.EARLY_MOMENT,
Moment.DRINKING_WATER -> when (machine.state) {
!is WaterMachineState.Cooling -> machine.trunCooling()
}
Moment.INSTANCE_NOODLES -> when (machine.state) {
!is WaterMachineState.Heating -> machine.trunHeating()
}
Moment.AFTER_WORK -> when (machine.state) {
!is WaterMachineState.Off -> machine.trunOff()
}
}
}
}
/**
* 程序的入口,测试饮水机的行为
*/
fun main(args: Array<String>) {
val machine = WaterMachine()
machine.waterMachineOps(machine, WaterMachine.Moment.DRINKING_WATER)
machine.waterMachineOps(machine, WaterMachine.Moment.INSTANCE_NOODLES)
machine.waterMachineOps(machine, WaterMachine.Moment.DRINKING_WATER)
machine.waterMachineOps(machine, WaterMachine.Moment.AFTER_WORK)
}
运行结果:
运行制冷
运行制热
运行制冷
关闭饮水机
状态机模式就一点,利用对象自身的状态改变自己的行为。
,