`

设计模式回顾之七:状态模式(State)

 
阅读更多

设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------

状态模式:

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

 

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

使用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

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

 

程序实现:

抽象状态类,定义一个与Context相关的状态接口handle:

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

具体状态类A:

public class ConcreteStateA extends State{
	@Override
	public void handle(Context context) {
		//处理A状态相关业务
		System.out.println("Now State is A ...");
		//执行完A逻辑后,自动切换到B状态.
		context.setState(new ConcreteStateB());
		System.out.println("Change State to B ...");
	}
} 

具体状态类B:

public class ConcreteStateB extends State{
	@Override
	public void handle(Context context) {
		//处理B状态相关业务
		System.out.println("Now State is B ...");
		//执行完B逻辑后,自动切换到A状态.
		context.setState(new ConcreteStateA());
		System.out.println("Change State to A ...");
	}
}

Context类定义当前的状态:

public class Context{
	private State currentState;//当前状态
	
	public Context(State state){
		currentState=state;
	}

	public void setState(State state){
		this.currentState=state;
	}
	public State getState(){
		return this.currentState;
	}
	
	/**
	 * 对请求做处理,并设置下一状态.
	 */
	public void changeState(){
		currentState.handle(this);//将Context对象本身的引用传入当前状态类,用以切换状态.
	}
}

程序入口:

public static void main(String[] args){
		Context context = new Context(new ConcreteStateA());//初始化状态为A
		context.changeState();//每次请求都切换状态
		context.changeState();
		context.changeState();
		context.changeState();
}

 

举例:用于消除庞大的条件分支语句的情况,通过把各种状态转移逻辑分布到State的子类之间,减少相互间的依赖。

 

分享到:
评论

相关推荐

    《设计模式:可复用面向对象软件的基础》英文版

    例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    在第25讲中,他集中对整个系列进行了一次全面的总结,让我们一起来回顾和探讨这些设计模式的核心要点。 设计模式是经过实践验证的、在特定场景下解决常见问题的最佳解决方案。它们是面向对象设计的智慧结晶,通过...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    从最初接触GoF的经典之作《设计模式:可复用面向对象软件的基础》,到后来的实际应用和教学过程中,作者经历了从困惑不解到豁然开朗的过程。这段旅程不仅是技术上的提升,更是思维方式的转变。 #### 1. 创建型模式 ...

    侯捷2015设计模式课件-同济

    首先,设计模式课件回顾了面向对象编程(Object-Oriented Programming,OOP)的基本原则,如封装、继承和多态,这些是设计模式依赖的基础。 接下来,课程深入讨论了GoF的设计模式。这些模式可以分为三类: 1. 创建...

    GoF 23种设计模式解析附C++实现源码(2nd Edition).pdf

    在完成所有设计模式的解析后,作者回顾了整个学习过程中的心路历程,包括初读GoF原著时的困惑、实现过程中遇到的问题以及最终领悟设计模式精髓时的喜悦。这一过程不仅仅是技术上的成长,更是一种思维方式的转变。 #...

    设计模式精解-GoF23种设计模式解析

    作者回顾了自己学习设计模式的过程,从最初的困惑和挑战到最终的领悟和应用,强调了实践的重要性。学习设计模式的过程不仅仅是理论上的理解,更是一种实践的过程,通过不断地实践才能真正掌握这些模式并将其应用于...

    11-回顾和总结(1).html

    在书中,作者们将这二十三种设计模式分成了三类,分别是...状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( Interpreter ) 书中通过一幅图,剖析了这二十三种设计模式的关系。

    DesignPatterns:回顾在软件体系结构和设计课程中看到的设计模式

    13. 状态模式(State Pattern):允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在Java中,状态模式常用于管理对象在不同状态下的行为。 14. 策略模式(Strategy Pattern):定义了一系列...

    算法导论 DesignPatterns Gof

    在最后一章中,作者们回顾了设计模式的发展历程,展望了未来可能的发展方向,并鼓励更多的软件工程师参与到模式社区中来。此外,书中还提供了一些基础类的定义和相关术语的解释,为读者提供了更全面的学习资源。 ...

    Game Programming Patterns游戏编程模式

    1. **设计模式回顾**(Design Patterns Revisited):书中的设计模式部分介绍了一些经典的设计模式,如: - **命令模式**(Command):将请求封装为一个对象,使你可以参数化不同请求,支持撤销操作,并可以将请求...

    DesignPattern.rar

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个"DesignPattern.rar"压缩包很可能是为了帮助应届毕业生和正在学习设计模式的开发者提供一套全面的资源。设计模式并不是一种具体的...

    从ASP到ASP.NET的会话状态管理

    它支持四种会话状态模式: 1. In-Process:默认模式,会话数据存储在ASP.NET应用程序的工作进程中,速度最快,但服务器重启会导致会话丢失。 2. StateServer:会话数据存储在一个单独的状态服务器进程(aspnet_...

    react-challege-28-managing-complex-state:用CodeSandbox创建

    - **MobX**:另一种状态管理库,它基于观察者模式,使得状态的改变更加直观和简单。 - **Hooks(如useReducer和useContext)**:React 16.8引入的特性,通过函数式组件内的Hooks来管理状态,简化了状态管理,尤其...

    基于xilinx fpga的vhdl液晶程序

    - **状态信号定义**:`SIGNAL PRE_STATE, NEXT_STATE: STATES;`定义了当前状态`PRE_STATE`和下一个状态`NEXT_STATE`。 #### 四、时序逻辑设计 时序逻辑是数字系统的重要组成部分,主要通过时钟信号同步系统的各个...

Global site tag (gtag.js) - Google Analytics