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

1、什么是状态模式?

状态模式(State)定义:java

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

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

类型:形为型模式 ide

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

2、状态模式UML

3、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改变状态时行为也会跟着改变。spa

4、使用场景

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

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

5、优缺点

一、优势

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

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

3) State对象可被共享

二、缺点

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

6、源码地址接口

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

相关文章
相关标签/搜索