设计模式-状态模式

UML类图

在这里插入图片描述

应用场景

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到不同一系列类当中,可以把复杂的判断逻辑简化。简单来说,当程序中存在大量if-else if-else结果或switch结构时,且每个结构中存在大量代码时,则可使用状态模式。为了灵活控制分钟结构中的代码,有时候需要增加分支,有时候需要减少分支,并且如果将大量的代码写入到一个if-else中,是难以维护的,一种简单的做法是将其封装成函数,通过if-else判断调用不同的函数即可,但该方法依然不能实现模块化。

代码实现

没有使用状态模式的结构:

public class Main {
	public static void main(String[] args) {
		int flag = 1;
		switch(flag){
			case 0:
				System.out.println("flag is 0");
				//省略其他大量的业务代码
				break;
			case 1:
				System.out.println("flag is 1");
				//省略其他大量的业务代码
				break;
			case 2:
				//省略其他大量的业务代码
				System.out.println("flag is 2");
				break;
		}
	}
}

输出结果:flag is 1

使用状态模式:
State类,将逻辑块抽象出来,封装成handle方法

public interface State {
	public void handle(Context context);
}

Context类,主要负责调度State的handle方法以及保存条件值

public class Context {
	private State state;
	private int flag;
	public void setFlag(int flag){
		this.flag = flag;
	}
	
	public int getFlag(){
		return this.flag;
	}
	public Context(State state,int flag){
		this.state = state;
		this.flag = flag;
	}
	public void setState(State state){
		this.state = state;
	}
	public void request(){
		state.handle(this);
	}
}

具体的状态类

public class ConcreteStateA implements State{
	@Override
	public void handle(Context context) {
		if(context.getFlag() == 0){
			System.out.println("flag is 0 and state is A");
			//这里可以是其他很多逻辑
		}else{
			context.setState(new ConcreteStateB());
			context.request();
		}
	}
}
public class ConcreteStateB implements State{
	@Override
	public void handle(Context context) {
		if(context.getFlag() == 1){
			System.out.println("flag is 1 and state is B");
			//这里可以是其他很多逻辑
		}else{
			context.setState(new ConcreteStateC());
			context.request();
		}
	}
}
public class ConcreteStateC implements State{
	@Override
	public void handle(Context context) {
		if(context.getFlag() == 2){
			System.out.println("flag is 2 and state is C");
			//这里可以是更多的其他逻辑
		}
	}
}

Main客户端

public class Main {
	public static void main(String[] args) {
		Context context = new Context(new ConcreteStateA(), 1);
		context.request();
		int flag = 1;
	}
}

输出结果:flag is 1 and state is B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值