`

设计模式之 State - 状态模式

阅读更多

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模式的结构

 



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.");
        }
    }
    
}



执行Client,输出结果:
C:\State>javac *.java
C:\State>java Client
Draw line.
Erase graph.
C:\State>
我们可以发现,通过改变ToolkitsPannel对象的状态(选择不同的画图工具),便改变了它的行为,其中并没有任何条件判断语句。
分享到:
评论

相关推荐

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

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

    java设计模式之-状态模式-实现

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...

    java-设计模式-状态模式-模拟审批流程-二级审批 完整代码

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个示例中,我们关注的是如何使用Java实现一个审批流程,特别是涉及二级审批的场景。这个压缩包文件包含了一个...

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

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为。 - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个...

    java 设计模式之状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...

    设计模式C++学习之状态模式(State)

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且使代码结构清晰,易于维护。 在C++中,状态模式通常包含以下几个关键...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式...状态模式(State Pattern)、原型模式(Prototype Pattern)、中介者模式(Mediator Pattern)、解释器模式(Interpreter Pattern)、享元...

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

    状态模式是一种行为设计模式,它使对象能够在内部状态改变时改变其行为,看起来好像改变了它的类。这种模式常用于处理对象在不同状态下表现各异的情况,避免了复杂的条件语句,提高了代码的可读性和可维护性。 在...

    设计模式专题之(二十一)状态模式---设计模式状态模式示例代码(python--c++)

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得对象的行为与其状态紧密相关,通过改变对象的状态,来改变对象的行为。 ...

    设计模式-状态模式分享ppt

    ### 设计模式之状态模式详解 #### 一、设计模式概述 设计模式是软件工程领域的一种最佳实践,它提供了一套解决特定问题的通用方案。根据功能的不同,设计模式大致可以分为三大类:创建型模式、结构型模式以及行为型...

    java常用设计模式-状态模式

    状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装成独立的类,并将请求委托给当前状态对象,从而实现状态的切换和...

    c++设计模式-行为型模式-状态模式

    c++设计模式-行为型模式-状态模式;qt工程;c++简单源码; 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

    State-Oriented Programmig

    这类似于面向对象设计模式,它们建立在继承和多态的元模式之上。 ### 状态导向编程的关键特征 状态导向编程的核心在于使用层次状态机作为设计的基础。以下是一些关键的特征: 1. **简单高效的实现**:文章提供了...

    设计模式 - 状态模式(C++实例)

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态转换逻辑,使代码结构更清晰,易于理解和维护。 在C++中实现状态模式,我们通常会...

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

    GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象编程中最核心的设计原则之一。这些模式可以帮助开发者解决常见的编程问题,并提高代码的可复用性和可维护性。 #### 创建型模式 创建型模式关注的是对象...

    设计模式PPT---25种设计模式详解

    7. 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。 8. 策略模式(Strategy):定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。 9. 模板方法模式(Template Method):在一个方法...

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

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

    设计模式-状态模式.pdf

    ### 设计模式之状态模式详解 #### 一、概述 状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来像改变了其类。这种模式的主要目的是将对象的状态作为独立的...

    23种 设计模式---面向对象的基本原则

    - 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎改变了它的类。 - 策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立...

    State-machine-clock.rar_state-machine_状态机_状态机 单片机

    状态机在IT行业中,特别是在嵌入式系统设计和微控制器编程中,是一种极其重要的设计模式。这个名为"State-machine-clock.rar"的压缩包文件显然包含了关于如何使用状态机设计一个51单片机驱动的时钟的相关资料。下面...

Global site tag (gtag.js) - Google Analytics