`

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. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...

    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)

    状态机的C语言编程

    状态机的实现方式有多种,包括switch/case、状态表维护、使用 State Pattern 和使用宏定义描述状态机等。 首先,switch/case 是最直观的方式,使用一堆条件判断,适合小巧的状态机。但是,这样的方式比较原始,对...

Global site tag (gtag.js) - Google Analytics