- 浏览: 103224 次
- 性别:
- 来自: 深圳
文章分类
最新评论
State模式也叫状态模式,是由GoF提出的23种软件设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
本文介绍设计模式中的(State)模式的概念,用法,以及实际应用中怎么样使用State模式进行开发。
State模式的概念与应用场景
State模式是行为模式之一。当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,这种情况可以考虑使用State模式来实现。
为了帮助理解,我们举例来说明。
一个画图程序,有一个控制面板,上面罗列了各种画图工具以及其它颜色选择,滴管等工具,当用户选择或改变了画图工具时,就可以使用各种不同的工具进行画图或其他操作了。
我们把这个过程用另外一种方法再描述一下:
- 用户选择画图工具就是一个画笔状态的改变。
- 每个工具能画的图形可能完全不一样,也就是说它们的行为各不一样。
- 改变了画图工具,在画布上画出的图形当然也不一样了,换句话说,画笔状态的改变导致行为的不一样。
怎么用程序实现这个过程呢?
我们先使用一般的方法(非State模式)来模拟选择画笔工具画图的过程:
//画笔工具选择事件处理方法
public void onSelectPen(int state) {
//根据不同的选择创建不同的画笔工具,然后画图
if (state == CIRCLE_PEN) {
CirclePen cp = new CirclePen(); //创建圆形画笔
cp.drawCircle(paramters); //画圆形
} else if (state == SQUARE_PEN) {
SquarePen sp = new SquarePen(); //创建方形画笔
sp.drawSquare(paramters); //画方形
} else if (state == LINE_PEN) {
LinePen lp = new LinePen();
lp.drawLine(paramters);
}
... //其他画笔
}
我们可以看到,需要为每一个画笔工具加一个判断条件,当画笔工具有增减或非常多时,代码不得不跟着作大量修改。
State模式对各种状态行为加以抽象,为每一个可能的状态创建一个状态类的子类,并通过一个Wrapper类管理状态子类对象的当前状态,对状态子类的调用加以封装。
用户可以通过改变Wrapper类对象所管理的状态来改变不同状态的行为。
为了帮助理解,我们举例来说明。
一个画图程序,有一个控制面板,上面罗列了各种画图工具以及其它颜色选择,滴管等工具,当用户选择或改变了画图工具时,就可以使用各种不同的工具进行画图或其他操作了。
我们把这个过程用另外一种方法再描述一下:
- 用户选择画图工具就是一个画笔状态的改变。
- 每个工具能画的图形可能完全不一样,也就是说它们的行为各不一样。
- 改变了画图工具,在画布上画出的图形当然也不一样了,换句话说,画笔状态的改变导致行为的不一样。
怎么用程序实现这个过程呢?
我们先使用一般的方法(非State模式)来模拟选择画笔工具画图的过程:
//画笔工具选择事件处理方法
public void onSelectPen(int state) {
//根据不同的选择创建不同的画笔工具,然后画图
if (state == CIRCLE_PEN) {
CirclePen cp = new CirclePen(); //创建圆形画笔
cp.drawCircle(paramters); //画圆形
} else if (state == SQUARE_PEN) {
SquarePen sp = new SquarePen(); //创建方形画笔
sp.drawSquare(paramters); //画方形
} else if (state == LINE_PEN) {
LinePen lp = new LinePen();
lp.drawLine(paramters);
}
... //其他画笔
}
我们可以看到,需要为每一个画笔工具加一个判断条件,当画笔工具有增减或非常多时,代码不得不跟着作大量修改。
State模式对各种状态行为加以抽象,为每一个可能的状态创建一个状态类的子类,并通过一个Wrapper类管理状态子类对象的当前状态,对状态子类的调用加以封装。
用户可以通过改变Wrapper类对象所管理的状态来改变不同状态的行为。
State模式的结构
State模式的角色:
State
对状态和状态行为的抽象。比如上面的例子,可以把每个画图工具看作状态的保持者。
ConcreteState
各种状态的具体实现。比如画线工具,擦除工具等。
StateWrapper
状态的外部封装类,或者说状态的容器类。它包含了对当前状态的引用。可以根据不同状态执行不同的行为。
State模式的应用范例
我们使用State模式来实现选择画笔工具进行画图的操作。
文件一览:
Client
测试类。
AbstractTool
相当于State角色。各种状态的抽象类。
LinePenTool
相当于ConcreteState角色。画线工具类。
EraseTool
相当于ConcreteState角色。图像擦除类。
ToolkitsPannel
相当于StateWrapper角色。使用currentTool保持状态。可以通过selectTool方法改变其状态。
代码:
public class Client {
/**
* Test State Pattern
*
*/
public static void main(String[] args) {
//创建工具面板
ToolkitsPannel pannel = new ToolkitsPannel();
//往工具面板上添加各种工具
AbstractTool tool1 = new LinePenTool();
pannel.addTool("LinePenTool", tool1);
AbstractTool tool2 = new EraseTool();
pannel.addTool("EraseTool", tool2);
//选择LinePenTool工具(改变状态)
pannel.selectTool("LinePenTool");
pannel.drawOrExecute();
//选择EraseTool工具(改变状态)
pannel.selectTool("EraseTool");
pannel.drawOrExecute();
}
}
/**
* State & subclass
*
*/
abstract class AbstractTool {
public abstract void drawOrExecute();
}
//State'subclass
class LinePenTool extends AbstractTool {
public void drawOrExecute() {
System.out.println("Draw line.");
}
}
//State'subclass
class EraseTool extends AbstractTool {
public void drawOrExecute() {
System.out.println("Erase graph.");
}
}
/**
* StateWrapper
*
*/
class ToolkitsPannel {
//保持各种工具的列表
Map <String, AbstractTool>toolsMap = new HashMap<String, AbstractTool>();
AbstractTool currentTool;
public void addTool(String toolName, AbstractTool tool) {
toolsMap.put(toolName, tool);
}
//改变状态
public void selectTool(String toolName) {
currentTool = toolsMap.get(toolName);
}
//执行具体的行为
public void drawOrExecute() {
if (currentTool != null) {
currentTool.drawOrExecute();
} else {
System.out.println("Please select a tool first.");
}
}
}
/**
* Test State Pattern
*
*/
public static void main(String[] args) {
//创建工具面板
ToolkitsPannel pannel = new ToolkitsPannel();
//往工具面板上添加各种工具
AbstractTool tool1 = new LinePenTool();
pannel.addTool("LinePenTool", tool1);
AbstractTool tool2 = new EraseTool();
pannel.addTool("EraseTool", tool2);
//选择LinePenTool工具(改变状态)
pannel.selectTool("LinePenTool");
pannel.drawOrExecute();
//选择EraseTool工具(改变状态)
pannel.selectTool("EraseTool");
pannel.drawOrExecute();
}
}
/**
* State & subclass
*
*/
abstract class AbstractTool {
public abstract void drawOrExecute();
}
//State'subclass
class LinePenTool extends AbstractTool {
public void drawOrExecute() {
System.out.println("Draw line.");
}
}
//State'subclass
class EraseTool extends AbstractTool {
public void drawOrExecute() {
System.out.println("Erase graph.");
}
}
/**
* StateWrapper
*
*/
class ToolkitsPannel {
//保持各种工具的列表
Map <String, AbstractTool>toolsMap = new HashMap<String, AbstractTool>();
AbstractTool currentTool;
public void addTool(String toolName, AbstractTool tool) {
toolsMap.put(toolName, tool);
}
//改变状态
public void selectTool(String toolName) {
currentTool = toolsMap.get(toolName);
}
//执行具体的行为
public void drawOrExecute() {
if (currentTool != null) {
currentTool.drawOrExecute();
} else {
System.out.println("Please select a tool first.");
}
}
}
执行Client,输出结果:
C:\State>javac *.java
C:\State>java Client
Draw line.
Erase graph.
C:\State>
C:\State>java Client
Draw line.
Erase graph.
C:\State>
我们可以发现,通过改变ToolkitsPannel对象的状态(选择不同的画图工具),便改变了它的行为,其中并没有任何条件判断语句。
发表评论
-
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1390Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1483Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1601Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1436Observer模式也叫观察者 ... -
设计模式之 Memento - 备忘录模式
2010-12-18 16:31 1092Memento模式也叫备忘录 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1149Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1201Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 1031Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 926Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1234Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1089Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1085Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 1044Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 887Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 837装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1494Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1044Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 951Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1165Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1100Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个示例中,我们关注的是如何使用Java实现一个审批流程,特别是涉及二级审批的场景。这个压缩包文件包含了一个...
- 状态模式(State):允许对象在其内部状态改变时改变它的行为。 - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且使代码结构清晰,易于维护。 在C++中,状态模式通常包含以下几个关键...
代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式...状态模式(State Pattern)、原型模式(Prototype Pattern)、中介者模式(Mediator Pattern)、解释器模式(Interpreter Pattern)、享元...
状态模式是一种行为设计模式,它使对象能够在内部状态改变时改变其行为,看起来好像改变了它的类。这种模式常用于处理对象在不同状态下表现各异的情况,避免了复杂的条件语句,提高了代码的可读性和可维护性。 在...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得对象的行为与其状态紧密相关,通过改变对象的状态,来改变对象的行为。 ...
### 设计模式之状态模式详解 #### 一、设计模式概述 设计模式是软件工程领域的一种最佳实践,它提供了一套解决特定问题的通用方案。根据功能的不同,设计模式大致可以分为三大类:创建型模式、结构型模式以及行为型...
这类似于面向对象设计模式,它们建立在继承和多态的元模式之上。 ### 状态导向编程的关键特征 状态导向编程的核心在于使用层次状态机作为设计的基础。以下是一些关键的特征: 1. **简单高效的实现**:文章提供了...
状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装成独立的类,并将请求委托给当前状态对象,从而实现状态的切换和...
c++设计模式-行为型模式-状态模式;qt工程;c++简单源码; 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态转换逻辑,使代码结构更清晰,易于理解和维护。 在C++中实现状态模式,我们通常会...
GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象编程中最核心的设计原则之一。这些模式可以帮助开发者解决常见的编程问题,并提高代码的可复用性和可维护性。 #### 创建型模式 创建型模式关注的是对象...
7. 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。 8. 策略模式(Strategy):定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。 9. 模板方法模式(Template Method):在一个方法...
状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化会导致其行为的变化,这种变化不是通过改变对象的类来实现的,而是通过改变对象的状态。这个模式的核心是封装可能...
### 设计模式之状态模式详解 #### 一、概述 状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来像改变了其类。这种模式的主要目的是将对象的状态作为独立的...
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类。 - 策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立...
状态机在IT行业中,特别是在嵌入式系统设计和微控制器编程中,是一种极其重要的设计模式。这个名为"State-machine-clock.rar"的压缩包文件显然包含了关于如何使用状态机设计一个51单片机驱动的时钟的相关资料。下面...