Java设计模式之状态模式
前言
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
用投票的场景来模拟
投票规则如下:同一个人只能投一票,其他票作废。
public abstract class AbsState {
public abstract void operate(String name);
}
创建处理正常投票的类
public class NormalState extends AbsState {
@Override
public void operate(String name) {
Client.nameMap.put(name, 1);
System.out.println("my name is normal state!
正常投票!");
}
}
创建处理非正常投票的类
public class OtherState extends AbsState {
@Override
public void operate(String name) {
System.out.println("my name is otherState!非正常投票");
}
}
最后创建投票的入口类 向外提供投票入口
public class Client {
private AbsState state;
public static HashMap<String, Integer> nameMap = new HashMap<>();
public void vote(String name) {
Integer count = nameMap.get(name);
if (count == null) {
state = new NormalState();
} else {
state = new OtherState();
}
state.operate(name);
}
}
测试 假设我投小明4票
public class Main {
public static void main(String[] args) {
Client client = new Client();
for (int i = 0; i < 4; i++) {
client.vote("小明");
}
System.out.println("投票结果如下:");
HashMap<String, Integer> map = Client.nameMap;
for (String key : map.keySet()) {
System.out.println(key + " and voted = " + map.get(key));
}
}
}
测试结果如下:可以看出只有第一次投票生效!
my name is normal state! 正常投票!
my name is otherState!非正常投票
my name is otherState!非正常投票
my name is otherState!非正常投票
投票结果如下:
小明 and voted = 1
在状态模式中,环境(Context)是持有状态的对象,但是环境(Context)自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类(比如例子中的NormalState,OtherState类)来处理。