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

定义:

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

角色:

环境(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值