根据状态决定行为 与visitor相似 面向对象的灵活应用
UML类图

例子:女孩子不同的状态做不同动作时会有不同反应===>State模式
1、女孩子根据不同的心理状态决定同一动作的不同表现
package com.mashibing.dp.state.v1;/*** 当增加新的状态时非常不方便*/public class MM {String name;private enum MMState {HAPPY, SAD}MMState state;public void smile() {//switch case}public void cry() {//switch case}public void say() {//switch case}}
2、使用State模式,女孩子的动作根据成员属性中的State属性调用的方法决定
MMState抽象类
package com.mashibing.dp.state.v2;public abstract class MMState {abstract void smile();abstract void cry();abstract void say();}
MMHappyState类(快乐状态类)
package com.mashibing.dp.state.v2;public class MMHappyState extends MMState {@Overridevoid smile() {System.out.println("happy smile");}@Overridevoid cry() {}@Overridevoid say() {}}
MMNervousState类
package com.mashibing.dp.state.v2;public class MMNervousState extends MMState {@Overridevoid smile() {}@Overridevoid cry() {}@Overridevoid say() {}}
MMSadState类
package com.mashibing.dp.state.v2;public class MMSadState extends MMState {@Overridevoid smile() {}@Overridevoid cry() {}@Overridevoid say() {}}
MM类(升级版)
package com.mashibing.dp.state.v2;/*** 当增加新的状态时非常不方便*/public class MM {String name;MMState state = new MMHappyState();public void smile() {state.smile();}public void cry() {state.cry();}public void say() {state.say();}}
GOF中的例子是TCPConnection(TCP有不同状态)
- operation不会再拓展的时候用State模式,否则State就不适合用(拓展操作需要给每一个状态修改代码添加方法)
- 当State不会拓展的时候,干脆就用switch,没必要拓展出这么多子类
有限状态机(FSM)
- 状态之间的迁移变化
- 多用途、跨学科
- 线程的状态迁移
- 线程挂起进入就绪状态,不会释放锁 线程挂起suspend与恢复resume
- block不消耗cpu,timewaiting消耗cpu因为要计时
- State模式和有限状态机是两个东西(一般会提到FSM举例?)
线程状态根据不同动作转移到相应状态
根据状态决定动作 LockSupport
ThreadState_抽象类(实体或名词用抽象类,动作或形容词用接口)
package com.mashibing.dp.state.thread;public abstract class ThreadState_ {abstract void move(Action input);abstract void run();}
NewState类
package com.mashibing.dp.state.thread;public class NewState extends ThreadState_ {private Thread_ t;public NewState(Thread_ t) {this.t = t;}@Overridevoid move(Action input) {if(input.msg == "start")t.state = new RunningState(t);}@Overridevoid run() {}}
RunningState类
package com.mashibing.dp.state.thread;public class RunningState extends ThreadState_ {private Thread_ t;public RunningState(Thread_ t) {this.t = t;}@Overridevoid move(Action input) {// TODO}@Overridevoid run() {}}
TerminatedState类
package com.mashibing.dp.state.thread;public class TerminatedState extends ThreadState_ {private Thread_ t;public TerminatedState(Thread_ t) {this.t = t;}@Overridevoid move(Action input) {// TODO}@Overridevoid run() {}}
Action类(动作)
package com.mashibing.dp.state.thread;public class Action {String msg;}
Thread_类
package com.mashibing.dp.state.thread;public class Thread_ {ThreadState_ state;void move(Action input) {// 根据现态和动作转移到下一状态state.move(input);}void run() {state.run();}}
思想:将对象作为构造方法的参数传进另一对象,让另一对象对当前对象进行操作!!!
练习拓展

