状态模式是根据状态决定行为。如果一个类的很多动作,都要根据不同的State来实现的话。就可以把State抽象出来,在State里面实现这个方法。

假设一个MM,她有三个行为:smile、cry、say,两个状态:HAPPY、SAD。

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 }}

状态模式就是看她,现在是开心还是伤心。来判断她是开心的笑,还是苦笑。

使用State模式

1、把MMState抽象成一个抽象类,有三个方法:smile、cry、say

public abstract class MMState { abstract void smile(); abstract void cry(); abstract void say();}

2、MMHappyState 继承 MMState,实现Happy时候的 smile、cry、say

MMSadState 继承 MMState,实现Sad时候的 smile、cry、say

public class MMHappyState extends MMState { @Override void smile() { System.out.println("happy smile"); } @Override void cry() { } @Override void say() { }}public class MMSadState extends MMState { @Override void smile() { } @Override void cry() { } @Override void say() { }}

State模式结构图:

打开网易新闻 查看精彩图片

如果需要扩展方法的话,是不能用State的模式的。因为扩展任何一个方法,所有的状态都要加一遍。