`

Statepattern

阅读更多

意图
允许一个对象在其内部状态改变时改变它的行为.

 

适用性
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为.
一个对象有不同的行为,这个行为是由它的状态来决定的,一个对象的状态是由它的
成员变量来决定的.
比如一个Person类,它有两个成员变量,一个姓名name,一个年龄age,当Person这个类
生成相应的对象之后,这个对象一旦名字或者年龄发生变化,我们说这个对象它的状态发
生了变化.如果它的成员变量都没有发生变化,那么这个对象就没有发生变化.

 

2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个
状态通常用一个或多个枚举常量来表示.通常,有多个操作包含这一相同的结构.
State模式将每一个条件分支放入一个独立的类中.这使得你可以更具对象自身的情况
将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化.
也就是说在if-else这种情况下里面,每个if-else里面执行的代码都把它封装在相应的对象,
其中对象和对象之间是不会产生干扰的,它们变化是不影响其他对象的.

 

构成:
1.抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的
状态所对应的行为.

 

2.具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态
所对应的行为.

 

3.环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例.这个
具体状态类的实例给出此环境对象的现有状态.
换句话说,客户端是和环境角色打交道,环境角色向客户端提供了一种行为,是由具体的状态
角色来给我们提供的,相应的环境角色里会持有对状态角色的一个引用.

 

环境角色里会持有相应具体状态角色的一个引用,当具体状态发生变化的时候,环境角色对外提供
的接口也发生了变化,因为底层维护着具体状态行为发生的变化,而每一个具体状态所对应的
行为又是不一样的,所以导致环境角色对外提供的接口发生了变化.

 

ClassDiagram:

 

SequenceDiagram:

 

 class Clinet
    {
        static void Main(string[] args)
        {
            Car c = new Car();
            c.Pull();
            c.Pull();
            c.Pull();
            c.Pull();
            Console.ReadKey();
        }
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    abstract class State
    {
        public abstract void pull(Car car);
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    class Car
    {
        private State current;

        public Car()
        {
            current = new Off();
            Console.WriteLine("新车生产出来了现在是空档!");
        }

        public void SetState(State state)
        {
            current = state;
        }

        public void Pull()
        {
            current.pull(this);
        }
    }

    class Off : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Low());
            Console.WriteLine("低档");
        }
    }

    class Low : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Midium());
            Console.WriteLine("中档");
        }
    }

    class Midium : State
    {
        public override void pull(Car car)
        {
            car.SetState(new High());
            Console.WriteLine("高档");
        }
    }

    class High : State
    {
        public override void pull(Car car)
        {
            car.SetState(new Off());
            Console.WriteLine("空档");
        }
    }

 

  • 大小: 52.6 KB
  • 大小: 84 KB
分享到:
评论

相关推荐

    状态模式 State Pattern

    ### 状态模式(State Pattern) #### 概念与定义 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。该模式通过引入一个代表各种状态的类以及一个行为随着这些...

    基于state pattern实现的xml解释器

    在软件设计领域,状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个案例中,“基于state pattern实现的xml解释器”指的是一个XML解析器,该...

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

    2. **State(抽象状态)**:这是所有具体状态类的抽象,通常是一个接口或抽象类,定义了所有可能的状态以及与每个状态相关的操作。 3. **ConcreteState(具体状态)**:实现了抽象状态定义的操作,每个具体状态类...

    JackChan1999#Java-Degisn-Patterns#状态模式-State Pattern1

    状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互

    状态模式(State Pattern)是一种行为设计模式

    状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式将一个对象的行为分解为各个独立的状态,并且每个状态都封装在自己的类中,使得对象在...

    StatePattern.unitypackage

    StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。

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

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

    状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组

    状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组件的详细说明 2.3 交互过程 三、状态模式的...

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    Context(State* initialState) : currentState(initialState) {} void setState(State* newState) { currentState = newState; } void doSomething() { currentState-&gt;handle(); } }; ``` 4. **使用状态...

    nevstop#LabVIEW-Design-Pattern#状态模式(State Pattern)1

    状态模式定义Allow an object to alter its behavior when its internal state changes. The

    【原创】Open close principle sample, state pattern, template method pattern

    在软件设计领域,设计模式是解决常见问题的可重用解决方案。它们是经过验证的、在特定上下文中高效的设计决策,被广泛应用于构建可维护和可扩展的软件系统。本篇将深入探讨“开闭原则”(Open Close Principle,OCP...

    statepattern-JAVASCRIPT

    状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在JavaScript中,状态模式同样适用,并且由于JavaScript的灵活性,实现起来相对简单。 状态...

    com.designpattern.state_observer.rar

    1. **状态模式(State Pattern)**: 状态模式允许对象在其内部状态改变时改变其行为。它将一个类的行为包装在独立的对象中,这些对象称为状态对象。每个状态对象代表一种特定的状态,并且负责处理与该状态相关的...

    Java_state_patten

    状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象在不同状态下的不同行为,使得对象的状态转换更加清晰,同时也解耦了...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) ...装饰模式(Decorator Pattern) 状态模式(State Pattern) 组合模式(Composite Pattern)

    StatePattern:软件设计模式

    首先,我们将创建 State 接口,该接口将定义应由不同的具体状态和上下文类实现的方法。 在我们的示例中,我们可以有两种状态 --&gt; 一种用于打开电视,另一种用于关闭电视。 因此,我们将为这些行为创建两个具体的...

    Think in Pattern

    3. **状态模式(State Pattern)**:通过引入`KissingPrincess.java`作为动机示例,本书阐述了状态模式如何帮助对象在其内部状态变化时改变其行为。 4. **享元模式(Flyweight Pattern)**:本书添加了一个简单的享...

    [行为型模式] 状态模式的理解

    以提供的`StatePattern.cpp`和`StatePattern.h`为例,我们可能会看到以下的实现方式: 在`StatePattern.h`中,`State`是抽象状态接口,它声明了各种与状态相关的操作。例如: ```cpp class State { public: ...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)

Global site tag (gtag.js) - Google Analytics