首页 > 设计模式 > 初尝State 模式

初尝State 模式

当对象拥有不同的状态,往往会导致行为不同。在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?

意图

允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。

结构图

state 结构图

话说,状态的改变也能用if-else 来完成逻辑演绎,但如果系统中增添了新的状态,则耦合的代码,就显得疲惫不堪了。如果状态很多,程序员自己也很难维护。这里的state 模式,将状态改变时影响的行为抽象到一个类里,用一个个具体的子类来表达不同的状态,从而很好的封装了变化点。

代码

using System;

namespace State
{
    class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            Editable edit = new Editable();
            Insert ins = new Insert();
            edit.NextState = ins;
            doc.SetState(edit);
            doc.Handle();
            //查看轮换后的效果
            doc.Handle();
        }
    }

    abstract class StatedWithDocument {
        StatedWithDocument nextState;

        public StatedWithDocument NextState
        {
            get { return nextState; }
            set { nextState = value; }
        }

        public abstract void Handle();

    }
    class Document {
        StatedWithDocument state;

        public void SetState(StatedWithDocument state) {
            this.state = state;
        }
        public void Handle() {
            this.state.Handle();
            //也许需要轮换
            this.state = this.state.NextState;
        }
    }
    class Editable : StatedWithDocument {
        public override void Handle() {
            Console.WriteLine("Now,I'm Editable...");
        }
    }

    class Insert : StatedWithDocument {
        public override void Handle() {
            Console.WriteLine("Now,I'm Insertable...");
        }
    }
}

运行结果

state 运行结果 初尝State 模式

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.