状态模式(State Pattern)

状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

这个模式将状态封装成为独立的类,并将动作委托到代表当前对象的对象,这样行为就与拥有状态类解耦了。

从客户的角度来看,对象的行为被完全改变,好像对象是从别的类实例化而来,但实际上我们是使用组合通过简单引用不同的状态对象来造成类改变的假象。

类图:

看到状态模式的类图,如果对策略模式熟悉的人,会发现两者的类图根本是一模一样的。

两个模式的差别在于它们的“意图”。

对状态模式来说,将一群行为封装在状态对象中,context的行为随时可委托给状态对象的人任何一个,当前状态在状态对象中游走改变,以反应Context的内部状态,Context的客户对状态对象不了解,仅有一个State接口的引用,不知道运行时具体是哪个状态类的行为。这样在Context内部不需要放置许多条件判断当前是哪种状态以决定行为这种不优雅的实现。

对策略模式来说,客户通常主动指定Context所要组合的策略对象是哪一个,一般不会轻易修改策略,策略模式只是让我们的设计更具弹性,能够在运行时改变策略,一般来说,策略模式可以想成是继承之外的一种弹性替代方案,如果使用继承来定义一个类的行为,就被这个行为困住,当行为改变时,必然要修改原有的代码,有了策略模式,可以通过组合不同的对象来改变行为,而不需要更改已经写好的代码。

下面举个例子:一个游戏有两个状态start和stop

interface State {
    public abstract void handle();
}

public class StartState implements State {  public void handle() {    System.out.println("In start state");  }}

public class StopState implements State {  public void handle() {    System.out.println("In stop state");  }}

public class Context {  State state;  public void request() {    state.handle();  }  pubblic void setState(State s){    state = s;  }  public State getState() {    return state;  }}

public class Client {  public static void main(String[] args) {    Context c = new Context();        StartState s1 = new StartState();    StopState s2 = new StartState();        c.setState(s1);    c.request();        c.setState(s2);    c.request();  }}
时间: 2024-10-05 13:47:59

状态模式(State Pattern)的相关文章

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中

状态模式(State Pattern)

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理. 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为. 具体状态(Concrete State

[设计模式] 20 状态模式 State Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着对象的具体状态,根据状态的不同使用分支结构来执行不同的功能,就像上面的代码那样处理:就像上面说的,类中存在大量的结构类似的分支语句,变得难以维护和理解.状态模式消除了分支语句,就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

状态模式 State

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. Context中有成员变量标志其状态,在每次请求过后,在具体状态类中设置其变化至的类. // State.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> using names

设计模式 ( 十七) 状态模式State(对象行为型)

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

19.状态者模式(State Pattern)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { //每个对象都有其对应的状态,而每个状态又对应一些相应的行为,如果某个对象有多个状态时, //那么就会对应很多的行为.那么对这些状态的判断和根据状态完成的行为,就会导致多重

学习笔记——状态模式State

状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeState(state),切换state对象. OperationInterface(),调用State->OperationInterface. OperationChangeState(),调用State->OperationChangeState(Context). State: ChangeSt