设计模式------状态模式

状态模式:主要解决的是当控制一个对象状态转换的条件表达式复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,可以考虑使用状态模式。

简单实现:

namespace StateMode {
    /// <summary>
    /// State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
    /// </summary>
    abstract class State {
        public abstract void Handle(Context context);
    }
}


namespace StateMode {
    /// <summary>
    /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
    /// </summary>
    class Context {
        private State state;

        //定义Context的初始状态
        public Context(State state) {
            this.state = state;
        }

        //可读写的状态属性,读取当前状态和设置新状态
        public State State {
            get { return state; }
            set {
                state = value;
                Console.WriteLine("当期状态:" + state.GetType().Name);
            }
        }
        /// <summary>
        /// 对请求处理,并设置下一状态
        /// </summary>
        public void Request() {
            state.Handle(this);
        }
    }
}

namespace StateMode {
    /// <summary>
    /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为
    /// </summary>
    class ConcreteStateA : State{
        public override void Handle(Context context) {
            context.State = new ConcreteStateB();
        }
    }
}

namespace StateMode {
    /// <summary>
    /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为
    /// </summary>
    class ConcreteStateB : State {
        public override void Handle(Context context) {
            context.State = new ConcreteStateA();
        }
    }
}

namespace StateMode {
    class Program {
        static void Main(string[] args) {
            Context c = new Context(new ConcreteStateA());
            c.Request();
            c.Request();
            c.Request();
            c.Request();
            Console.Read();
        }
    }
}

/*输出
当期状态:ConcreteStateB
当期状态:ConcreteStateA
当期状态:ConcreteStateB
当期状态:ConcreteStateA*/
发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/104057099
今日推荐