设计模式学习之状态模式

状态模式很简单,直接上代码:

code:

/**
 * 状态接口
 */
interface State {
	void execute();
}
/**
 * 具体的三个状态
 */
class StateA implements State{
	@Override
	public void execute() {
		// TODO Auto-generated method stub
		System.err.println("执行状态A");
	}
}
class StateB implements State{
	@Override
	public void execute() {
		// TODO Auto-generated method stub
		System.err.println("执行状态B");
	}
}
class StateC implements State{
	@Override
	public void execute() {
		// TODO Auto-generated method stub
		System.err.println("执行状态C");
	}
}
class Context{
	private State state;
	public Context(State state) {
		super();
		this.state = state;
	}
	public void contextInterface(){
		state.execute();
	}
	
}
public class Test {
	public static void main(String[] args) {
		new Context(new StateA()).contextInterface();
	}

}

如果了解策略模式的同学可能会发现,怎么和策略模式的实现如出一辙呢,对的,你的想法是正确的。

但是其实它们是有区别的,策略模式讲的的是策略,在你的业务逻辑中一次只能使用一种策略,状态模式讲的是状态改变,

在每一个具体状态角色中来指定后续状态以及何时进行转换。

实际中有这样问题:

租户在房屋租赁的时候一般有这几个状态:申请中,申请成功,申请失败,退租中,退租成功,退租失败


code:

/**
 * 状态接口
 */
interface State {
	void execute(Person person) throws Exception;
}
/**
 * 人定义
 */
class Person{
	State state = null;

	public State getState() {
		return state;
	}
	public void setState(State state) {
		try {
			state.execute(this);//这里使用了访问者模式
			this.state = state;
			System.err.println("设置成功");
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("设置状态异常");
		}
		
	}
	
}
/**
 * 具体的六个状态
 */
class SHQ_zhong implements State{//申请中

	@Override
	public void execute(Person person) throws Exception {
		// TODO Auto-generated method stub
		State s = person.getState();
		if(s!=null){
			throw new Exception();
		}	
	}
}
class SHQ_is implements State{//申请成功

	@Override
	public void execute(Person person)throws Exception {
		// TODO Auto-generated method stub
		State s = person.getState();
		if(!(s instanceof SHQ_zhong)){
			throw new Exception();
		}	
		
	}
}
class SHQ_no implements State{//申请失败
	@Override
	public void execute(Person person) throws Exception{
		// TODO Auto-generated method stub
		State s = person.getState();
		if(!(s instanceof SHQ_zhong)){
			throw new Exception();
		}	
		
	}
}
class TZ_zhong implements State{//退租申请中
	@Override
	public void execute(Person person)throws Exception {
		// TODO Auto-generated method stub
		State s = person.getState();
		if(!(s instanceof SHQ_is)){
			throw new Exception();
		}	
	}	
}
class TZ_is implements State{//退租成功
	@Override
	public void execute(Person person)throws Exception {
		// TODO Auto-generated method stub
		State s = person.getState();
		if(!(s instanceof TZ_zhong)){
			throw new Exception();
		}	
		
	}	
}
class TZ_no implements State{//退租失败
	@Override
	public void execute(Person person) throws Exception{
		// TODO Auto-generated method stub
		State s = person.getState();
		if(!(s instanceof TZ_zhong)){
			throw new Exception();
		}	
		
	}
}

public class Test {
	public static void main(String[] args) {
		Person p  =new Person();
		p.setState(new SHQ_zhong());
		p.setState(new SHQ_is());
		//p.setState(new TZ_zhong());
		p.setState(new TZ_is());
	}

}

总结:这里也没啥好总结,状态模式和策略模式代码结构可能完全一样,但是他们也是有差别的。

状态模式讲究是状态的改变,策略模式讲究的是策略的选择。PS:个人感觉策略模式和状态模式的特例


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变它的行为。 状态模式的核心思想是将对象的状态从对象本身中分离出来,并将状态的行为委托给代表该状态的对象。这样,当对象的状态发生改变时,它将委托给代表该状态的对象来处理行为,而不是在对象本身中进行判断和处理。 状态模式包含以下几个角色: 1. Context(上下文):定义客户端感兴趣的接口,并维护一个当前状态的引用。 2. State(状态):定义状态的接口,并封装与该状态相关的行为。 3. ConcreteState(具体状态):实现状态的接口,并封装与该状态相关的行为。 下面以一个简单的电梯状态转换为例来说明状态模式: ```java // Context public class Elevator { private State state; public Elevator() { this.state = new ClosedState(); } public void setState(State state) { this.state = state; } public void open() { state.open(this); } public void close() { state.close(this); } public void run() { state.run(this); } public void stop() { state.stop(this); } } // State public interface State { void open(Elevator elevator); void close(Elevator elevator); void run(Elevator elevator); void stop(Elevator elevator); } // ConcreteState public class ClosedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门打开"); elevator.setState(new OpenedState()); } @Override public void close(Elevator elevator) { System.out.println("电梯门已关闭"); } @Override public void run(Elevator elevator) { System.out.println("电梯开始运行"); elevator.setState(new RunningState()); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); } } public class OpenedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门已打开"); } @Override public void close(Elevator elevator) { System.out.println("电梯门关闭"); elevator.setState(new ClosedState()); } @Override public void run(Elevator elevator) { System.out.println("电梯门未关闭,无法运行"); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); elevator.setState(new StoppedState()); } } public class RunningState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯运行中,无法开门"); } @Override public void close(Elevator elevator) { System.out.println("电梯运行中,无法关门"); } @Override public void run(Elevator elevator) { System.out.println("电梯仍在运行中"); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); elevator.setState(new StoppedState()); } } public class StoppedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门打开"); elevator.setState(new OpenedState()); } @Override public void close(Elevator elevator) { System.out.println("电梯门已关闭"); elevator.setState(new ClosedState()); } @Override public void run(Elevator elevator) { System.out.println("电梯开始运行"); elevator.setState(new RunningState()); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); } } ``` 在上面的例子中,电梯的状态可以是“开门状态”、“关门状态”、“运行状态”和“停止状态”,而这些状态的行为可以通过状态模式来进行封装和处理。具体来说,电梯的状态被封装为一个状态接口,并有不同的状态实现类来实现具体的行为。在上下文类中,我们维护了一个当前状态的引用,并将操作委托给当前状态的对象来处理。 当电梯的状态发生改变时,我们只需要更改当前状态的引用即可,而不需要在上下文类中进行状态判断和处理,从而使得代码更加清晰、简洁、可维护性更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值