根据状态决定行为 与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 {
@Override
void smile() {
System.out.println("happy smile");
}
@Override
void cry() {
}
@Override
void say() {
}
}
MMNervousState类
package com.mashibing.dp.state.v2;
public class MMNervousState extends MMState {
@Override
void smile() {
}
@Override
void cry() {
}
@Override
void say() {
}
}
MMSadState类
package com.mashibing.dp.state.v2;
public class MMSadState extends MMState {
@Override
void smile() {
}
@Override
void cry() {
}
@Override
void 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;
}
@Override
void move(Action input) {
if(input.msg == "start")
t.state = new RunningState(t);
}
@Override
void run() {
}
}
RunningState类
package com.mashibing.dp.state.thread;
public class RunningState extends ThreadState_ {
private Thread_ t;
public RunningState(Thread_ t) {
this.t = t;
}
@Override
void move(Action input) {
// TODO
}
@Override
void run() {
}
}
TerminatedState类
package com.mashibing.dp.state.thread;
public class TerminatedState extends ThreadState_ {
private Thread_ t;
public TerminatedState(Thread_ t) {
this.t = t;
}
@Override
void move(Action input) {
// TODO
}
@Override
void 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();
}
}