定义:
状态模式是对象的行为模式,允许一个对象在其内部状态改变时改变他的行为,这个对象看上去就像改变了他的类一样。
角色:
环境(Context)角色:定义客户端感兴趣的接口,并且保留一个具体状态类的实例,具体状态类的实例给出环境类的当前状态。
抽象状态(State)角色:定义一个接口,用以封装环境角色的具体状态类的行为。
具体状态(ConcreteState)角色:每一个具体状态类都实现环境角色的状态对应的具体行为。
例子:
每个工厂都会有考勤系统,其中对上班迟到的惩罚可分成不同的级别,如果迟到30分钟之内不扣钱,如果迟到超过30分钟要扣半天的工资,此时将迟到的行为抽象到接口中,作为抽象状态角色(State),不同的迟到行为作为具体状态角色(ConcreteState),环境角色则根据不同的状态调用不同的具体状态类。
类图:
代码:
/**
* 环境角色类
* @author wang
*/
public class Context {
//持有 一个CardState类型的对象
private CardState cardState = null;
public void setCardState(CardState cardState){
this.cardState = cardState;
}
//转交抽象类处理
public void request(String mess){
cardState.handle(mess);
}
}
/**
* 抽象状态类
* @author wang
*/
public interface CardState {
//相应的处理方法
public void handle(String mess);
}
/**
* 具体状态类
* @author wang
*/
public class ConcreteCardStateA implements CardState {
public void handle(String mess) {
System.out.println(mess + "迟到30分钟之内,不扣钱" );
}
}
/**
* 具体状态类
* @author wang
*/
public class ConcreteCardStateB implements CardState {
public void handle(String mess) {
System.out.println(mess + "迟到超过30分钟,扣半天工资");
}
}
/**
* 客户端类
* @author wang
*/
public class Client {
public static void main(String[] args){
//创建状态
CardState state = new ConcreteCardStateA();
//创建环境
Context context = new Context();
//将状态设置到环境中
context.setCardState(state);
//请求
context.request("我迟到了20分钟,会有什么惩罚:");
//创建状态
CardState stateB = new ConcreteCardStateB();
//将状态设置到环境中
context.setCardState(stateB);
//请求
context.request("我迟到了40分钟,会有什么惩罚:");
}
}
运行结果: