`
GavinZheng
  • 浏览: 16014 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

状态模式(State Pattern)

 
阅读更多
状态模式(State Pattern)
状态模式:当一个对象内在状态改变时允许其行为改变,这个对象看起来像改变其类。



思想:采用你中有我,我中有你的方法,将Context类中的逻辑方法到具体的State子类中实现。传递的过程中,交由子类的方法执行,如A-B的过程中,首先给Context定义一个状态A,使用MethodA激A当前的状态,交由SateA处理。A可走的流程只有B,在A中首先将Context状态设置为B,然后交由SateB处理。以下代码围绕着下面的状态转换图去实现。



package org.state;

public abstract class State {
	protected Context context;

	public void setContext(Context context) {
		this.context = context;
	}

	public abstract void MethodA();

	public abstract void MethodB();

	public abstract void MethodC();

	public abstract void MethodD();

}



package org.state;

public class Context {
	public final static StateA STATE_A = new StateA();
	public final static StateB STATE_B = new StateB();
	public final static StateC STATE_C = new StateC();
	public final static StateD STATE_D = new StateD();

	private State currentState;

	public State getCurrentState() {
		return currentState;
	}

	public void setCurrentState(State currentState) {
		this.currentState = currentState;
		this.currentState.setContext(this);
	}

	public void MethodA() {
		this.currentState.MethodA();
	}

	public void MethodB() {
		this.currentState.MethodB();
	}

	public void MethodC() {
		this.currentState.MethodC();
	}

	public void MethodD() {
		this.currentState.MethodD();
	}
}




package org.state;

//	A的下一状态为B
public class StateA extends State {

	@Override
	public void MethodA() {
		System.out.println("我是状态A");
	}

	@Override
	public void MethodB() {
		super.context.setCurrentState(Context.STATE_B);
		super.context.MethodB();
	}

	@Override
	public void MethodC() {
		// TODO Auto-generated method stub

	}

	@Override
	public void MethodD() {
		// TODO Auto-generated method stub

	}

}




package org.state;
//	B下一状态为C或者D
public class StateB extends State {

	@Override
	public void MethodA() {
		
	}

	@Override
	public void MethodB() {
		System.out.println("我是状态B");
	}

	@Override
	public void MethodC() {
		super.context.setCurrentState(Context.STATE_C);
		super.context.MethodC();
	}

	@Override
	public void MethodD() {
		super.context.setCurrentState(Context.STATE_D);
		super.context.MethodD();
	}

}




package org.state;

//	C的下一状态为D或者A
public class StateC extends State {

	@Override
	public void MethodA() {
		super.context.setCurrentState(Context.STATE_A);
		super.context.MethodA();
	}

	@Override
	public void MethodB() {

	}

	@Override
	public void MethodC() {
		System.out.println("我是状态C");
	}

	@Override
	public void MethodD() {
		super.context.setCurrentState(Context.STATE_D);
		super.context.MethodD();
	}

}




package org.state;

//	D的下一状态为A
public class StateD extends State {

	@Override
	public void MethodA() {
		super.context.setCurrentState(Context.STATE_A);
		super.context.MethodA();
	}

	@Override
	public void MethodB() {
	}

	@Override
	public void MethodC() {
	}

	@Override
	public void MethodD() {
		System.out.println("我是状态D");
	}

}




package org.state;

public class Client {
	public static void main(String[] args) {
		Context context = new Context();
		context.setCurrentState(new StateA());
		// 状态的转换A-B-C-D;
		System.out.println("---------------A-B-C-D--------------");
		context.MethodA();
		context.MethodB();
		context.MethodC();
		context.MethodD();
		// 由于A不能直接转化为C,所以后面的没有执行
		System.out.println("---------------A-C-D---------------");
		context.setCurrentState(new StateA());
		context.MethodA();
		context.MethodC();
		context.MethodD();
		// 状态的转换B-D-A;
		System.out.println("---------------B-D-A---------------");
		context.setCurrentState(new StateA());
		context.MethodB();
		context.MethodD();
		context.MethodA();
	}

}

输出结果:
---------------A-B-C-D--------------
我是状态A
我是状态B
我是状态C
我是状态D
---------------A-C-D---------------
我是状态A
---------------B-D-A---------------
我是状态B
我是状态D
我是状态A
  • 大小: 15.9 KB
  • 大小: 18.6 KB
分享到:
评论

相关推荐

    状态模式 State Pattern

    ### 状态模式(State Pattern) #### 概念与定义 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。该模式通过引入一个代表各种状态的类以及一个行为随着这些...

    设计模式之状态模式(State Pattern)

    状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化会导致其行为的变化,这种变化不是通过改变对象的类来实现的,而是通过改变对象的状态。这个模式的核心是封装可能...

    JackChan1999#Java-Degisn-Patterns#状态模式-State Pattern1

    状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互

    状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组

    状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组件的详细说明 2.3 交互过程 三、状态模式的...

    状态模式(State Pattern)是一种行为设计模式

    状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式将一个对象的行为分解为各个独立的状态,并且每个状态都封装在自己的类中,使得对象在...

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。在C++中实现状态模式,我们...

    《设计模式》实战---状态模式(State Pattern)

    在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...

    基于state pattern实现的xml解释器

    在软件设计领域,状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个案例中,“基于state pattern实现的xml解释器”指的是一个XML解析器,该...

    nevstop#LabVIEW-Design-Pattern#状态模式(State Pattern)1

    状态模式定义Allow an object to alter its behavior when its internal state changes. The

    StatePattern.unitypackage

    StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。

    设计模式State模式源码

    State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果...

    JAVA设计模式之行为模式 责任链模式和状态模式

    本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

    状态模式Java实现示例

    状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。这个对象看起来好像修改了它的类。状态模式主要解决的是当一个对象的行为依赖于它的状态时,如何将这些状态从对象中...

    State Machine Java Pattern

    与传统的状态模式相比,采用状态机模式设计的类更加具有重用性。 #### 关键词 设计、模式、自动机、有限状态机、行为、状态、转换、状态图 #### 引言 自[Kle56]引入正则表达式并证明了有限自动机与正则表达式的...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) ...装饰模式(Decorator Pattern) 状态模式(State Pattern) 组合模式(Composite Pattern)

    设计模式的状态模式的例子

    在"StatePattern"这个压缩包中,我们可能找到以下文件: - `State.java`: 定义了状态接口。 - `NormalState.java`, `BusyState.java`: 具体的状态类,实现了`State`接口并提供了对应状态的行为。 - `Context.java`:...

    python 状态模式(示例)

    设计模式——状态模式状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)

    用Java实现23种设计模式

    状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表...

Global site tag (gtag.js) - Google Analytics