状态模式(State)—考勤系统

来源:互联网 发布:软件测试日志模板 编辑:程序博客网 时间:2024/05/22 11:38

定义:

状态模式是对象的行为模式,允许一个对象在其内部状态改变时改变他的行为,这个对象看上去就像改变了他的类一样。

角色:

环境(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分钟,会有什么惩罚:");    }}
运行结果:



0 0
原创粉丝点击