设计模式----状态模式UML和实现代码

隐身守侯 提交于 2020-04-10 10:10:44

一、什么是状态模式?

状态模式(State)定义:

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

类型:形为型模式 

顺口溜:中访策备迭 模命职解

二、状态模式UML

三、JAVA代码实现

package com.amosli.dp.behavior.state;

public abstract class State {
	public abstract void handle(Context context);
}

package com.amosli.dp.behavior.state;


public class Context {
	private State state;

	public State getState() {
		return state;
	}

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

	public Context(State state) {
		this.state = state;
	}

	public void request() {
		state.handle(this);
	}
}

    package com.amosli.dp.behavior.state;

public class ConcreteState1 extends State {

	@Override
	public void handle(Context context) {
		System.out.println("this is state1");
		context.setState(new ConcreteState2());
	}

package com.amosli.dp.behavior.state;

public class ConcreteState2 extends State {


	@Override
	public void handle(Context context) {
		System.out.println("this is state2");
		context.setState(new ConcreteState3());
	}

}
}

package com.amosli.dp.behavior.state;

public class ConcreteState3 extends State {

	@Override
	public void handle(Context context) {
		System.out.println("this is state3");
		context.setState(new ConcreteState1());
	}

}

package com.amosli.dp.behavior.state;

public class Client {
	public static void main(String[] args) {
		Context context = new Context(new ConcreteState1());
		context.request();
		context.request();
		context.request();
		context.request();
	}
}

  状态模式包含如下角色: 
       Context: 环境类。可以包括一些内部状态。 
       State: 抽象状态类。State定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间就可以互相转换了。 
       ConcreteState: 具体状态类。具体状态类,用于处理来自Context的请求,每一个ConcreteState都提供了它对自己请求的实现,所以,当Context改变状态时行为也会跟着改变。

四、使用场景

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

五、优缺点

1、优点

1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来

2) 它使得状态转换显式化

3) State对象可被共享

2、缺点

1) 状态模式的使用必然会增加系统类和对象的个数。
2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

六、源码地址

本系列文章源码地址,https://github.com/amosli/dp  欢迎Fork  & Star !!



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!