状态模式(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
- 状态模式(State)—考勤系统
- 状态模式(State)
- State(状态模式)
- State(状态)模式
- 状态(State)模式
- 状态模式(State)
- 状态模式(State)
- 状态模式(State)
- State(状态模式)
- State(状态模式)
- 状态模式(State)
- 状态模式(State)
- 状态模式(State)
- 状态模式(state)
- STATE(状态)模式
- 状态模式(State)
- 状态模式(state)
- 状态模式(State)
- YTU 2864: 分跑道。
- enum 数值 和 字符串的对应
- 支持向量机(SVM)(二)
- TTServer入门
- ssh 批量无密码登陆设
- 状态模式(State)—考勤系统
- 实现垂直居中的一种好用的方法
- 设计模式的思考1
- ExtJs中如何在事件中传值
- Java异步并发Callable与Runable
- 检测PC端和mobile端
- oracle的physical dataguard的配置过程
- SDWebImage源代码理解
- 在平台中调用网格部件.DeleteFocusedRow()后在循环访问网格部件.DataTabel时报错