设计模式之状态模式

状态模式就是一个实体有多个状态,不同状态的实现是不同的,实体通过状态类来实现操作。缺点就是每个状态要有实现,意味着如果新加状态,代码会有改动,不满足开闭原则

状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。

状态分为开会、工作、休息三个状态
休息时可以去开会、工作
工作可以休息、开会
开会时可以去工作,不能去休息

状态接口及实现

package test2019.mon03.状态模式;

public abstract class State {

	public void goMeet(Worker worker) {
		System.out.println("好的!"+worker.getName()+"去开会!");
		worker.setState(Worker.getState("meet"));
	}

	public void goWork(Worker worker) {
		System.out.println("好的!"+worker.getName()+"去工作!");
		worker.setState(Worker.getState("work"));

	}

	public void goPlay(Worker worker) {
		System.out.println("好的!"+worker.getName()+"去休息!");
		worker.setState(Worker.getState("play"));

	}
}

package test2019.mon03.状态模式;

public class MeetState extends State {

	@Override
	public void goMeet(Worker worker) {
		System.out.println(worker.getName()+"已经在开会");
	}

	@Override
	public void goPlay(Worker worker) {
		System.out.println(worker.getName()+"会议期间,不能去休息");
	}
}

package test2019.mon03.状态模式;

public class PlayState extends State {

	@Override
	public void goPlay(Worker worker) {
		System.out.println(worker.getName()+"已经在休息了");
	}

}

package test2019.mon03.状态模式;

public class WorkState extends State {

	@Override
	public void goWork(Worker worker) {
		System.out.println(worker.getName()+"已经在工作了");
	}

}

员工类

package test2019.mon03.状态模式;

public class Worker {

	private State state;
	private static State workState,playState,meetState;
	private String name;
	
	public Worker(String name) {
		this.name = name;
		workState = new WorkState();
		playState = new PlayState();
		meetState = new MeetState();
		state = playState;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}

	public static State getState(String state) {
		if(state.equals("work")) {
			return workState;
		}
		if(state.equals("play")) {
			return playState;
		}
		if(state.equals("meet")) {
			return meetState;
		}
		return null;
	}
	
	public void goMeet() {
		state.goMeet(this);
	}

	public void goWork() {
		state.goWork(this);
	}

	public void goPlay() {
		state.goPlay(this);
	}
}

测试类

package test2019.mon03.状态模式;

public class Test {

	public static void main(String[] args) {
		Worker ming = new Worker("ming");
		ming.goMeet();
		ming.goPlay();
		ming.goWork();
		ming.goPlay();
		System.out.println();
		Worker uzi = new Worker("uzi");
		uzi.goPlay();
		uzi.goMeet();
		uzi.goWork();
		uzi.goPlay();
		
	}
}

结果

好的!ming去开会!
ming会议期间,不能去休息
好的!ming去工作!
好的!ming去休息!

uzi已经在休息了
好的!uzi去开会!
好的!uzi去工作!
好的!uzi去休息!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值