状态模式(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【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互
状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组件的详细说明 2.3 交互过程 三、状态模式的...
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式将一个对象的行为分解为各个独立的状态,并且每个状态都封装在自己的类中,使得对象在...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。在C++中实现状态模式,我们...
在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...
在软件设计领域,状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个案例中,“基于state pattern实现的xml解释器”指的是一个XML解析器,该...
状态模式定义Allow an object to alter its behavior when its internal state changes. The
StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。
State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果...
本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...
状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。这个对象看起来好像修改了它的类。状态模式主要解决的是当一个对象的行为依赖于它的状态时,如何将这些状态从对象中...
与传统的状态模式相比,采用状态机模式设计的类更加具有重用性。 #### 关键词 设计、模式、自动机、有限状态机、行为、状态、转换、状态图 #### 引言 自[Kle56]引入正则表达式并证明了有限自动机与正则表达式的...
备忘录模式(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`:...
设计模式——状态模式状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同...
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)
状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表...