diff --git a/go/state/main.go b/go/state/main.go new file mode 100644 index 0000000..6169329 --- /dev/null +++ b/go/state/main.go @@ -0,0 +1,61 @@ +package main + +import "fmt" + +/* +实例: +一个任务状态机 +*/ + +type Task struct { + state State +} + +func (t *Task) SetState(state State) { + t.state = state +} + +func (t *Task) Handle() { + t.state.Handle(t) +} + +// 状态接口 +type State interface { + Handle(t *Task) +} + +// 具体状态 - 待处理 +type PendingState struct{} + +func (p *PendingState) Handle(t *Task) { + fmt.Println("任务待处理,开始处理任务...") + t.SetState(&InProgressState{}) +} + +// 具体状态 - 进行中 +type InProgressState struct{} + +func (i *InProgressState) Handle(t *Task) { + fmt.Println("任务处理中,完成任务...") + t.SetState(&CompletedState{}) +} + +// 具体状态 - 已完成 +type CompletedState struct{} + +func (c *CompletedState) Handle(t *Task) { + fmt.Println("任务已完成,无法再处理。") +} + +func main() { + fmt.Println("============= 状态模式 =============") + + task := &Task{state: &PendingState{}} + + task.Handle() + task.Handle() + task.Handle() + + fmt.Println() + fmt.Println("=========== 状态模式结束 ===========") +} diff --git a/python/state/main.py b/python/state/main.py new file mode 100644 index 0000000..1d01087 --- /dev/null +++ b/python/state/main.py @@ -0,0 +1,49 @@ +""" +实例: +一个任务状态机 +""" + +from abc import ABC, abstractmethod + +class Task: + state: 'State' + def __init__(self): + self.set_state(PendingState()) + + def set_state(self, state: 'State'): + self.state = state + + def handle(self): + self.state.handle(self) + + +# 状态接口 +class State(ABC): + @abstractmethod + def handle(self, context): + pass + +# 具体状态 - 待处理 +class PendingState(State): + def handle(self, context): + print("任务待处理,开始处理任务...") + context.set_state(InProgressState()) + +# 具体状态 - 处理中 +class InProgressState(State): + def handle(self, context): + print("任务处理中,完成任务...") + context.set_state(CompletedState()) + +# 具体状态 - 已完成 +class CompletedState(State): + def handle(self, context): + print("任务已完成,无法再处理。") + +if __name__ == "__main__": + print("============= 状态模式 =============") + task = Task() + task.handle() + task.handle() + task.handle() + print("\n=========== 状态模式结束 ===========") \ No newline at end of file diff --git a/ts/src/state/index.ts b/ts/src/state/index.ts new file mode 100644 index 0000000..7cee675 --- /dev/null +++ b/ts/src/state/index.ts @@ -0,0 +1,57 @@ +/* +实例: +一个任务状态机 +*/ + +class Task { + state: State; + + constructor() { + this.state = new PendingState(); + } + + setState(state: State) { + this.state = state; + } + + handle() { + this.state.handle(this); + } +} + +// 状态接口 +interface State { + handle(task: Task): void; +} + +// 具体状态 - 待处理 +class PendingState implements State { + handle(task: Task): void { + console.log("任务待处理,开始处理任务..."); + task.setState(new InProgressState()); + } +} + +// 具体状态 - 进行中 +class InProgressState implements State { + handle(task: Task): void { + console.log("任务进行中,完成任务..."); + task.setState(new CompletedState()); + } +} + +// 具体状态 - 已完成 +class CompletedState implements State { + handle(task: Task): void { + console.log("任务已完成,无法再处理。"); + } +} + +(function () { + console.log("============= 状态模式 ============="); + const task = new Task(); + task.handle(); + task.handle(); + task.handle(); + console.log("\n=========== 状态模式结束 ==========="); +})();