设计模式——状态,C# 语言范例

此范例共4个状态,2种操作,没用interface而是用abstract修饰的class实现。

调用:

            TransServer ts = new TransServer();
            Console.WriteLine(ts.StopServer());
            Console.WriteLine(ts.StartServer());
            Console.WriteLine(ts.StartServer());
            Console.WriteLine(ts.StopServer());
            Console.WriteLine(ts.StopServer());

 

实现:

    internal abstract class State
    {
        internal TransServer transServer;

        public abstract ErrorCode StartServer();
        public abstract ErrorCode StopServer();
    }

    internal class StoppedState : State
    {
        public StoppedState(TransServer ts)
        {
            this.transServer = ts;
        }
        /// <summary>
        /// Stopped --> Init --> Worked or Error or Others.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StartServer()
        {
            // 下一个状态是initstate
            this.transServer.SetState(this.transServer.GetInitState());
            // do something...

            // finishd...
            // 下一个状态是WorkingState
            this.transServer.SetState(this.transServer.GetWorkingState());
            return ErrorCode.NoError;
        }
        /// <summary>
        /// Do nothing.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StopServer()
        {
            // it was already stopped!
            return ErrorCode.AlreadyClosed;
        }
    }

    internal class InitState : State
    {
        public InitState(TransServer ts)
        {
            this.transServer = ts;
        }
        /// <summary>
        /// Do nothing.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StartServer()
        {
            // 正在初始化,不应重复启动。
            return ErrorCode.WaitUntilInitialed;
        }
        /// <summary>
        /// Do nothing.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StopServer()
        {
            // 初始化可以被终止吗??
            return ErrorCode.WaitUntilInitialed;
        }
    }

    internal class WorkingState : State
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="ts"></param>
        public WorkingState(TransServer ts)
        {
            this.transServer = ts;
        }
        /// <summary>
        /// Do nothing.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StartServer()
        {
            return ErrorCode.AlreadyStarted;
        }
        /// <summary>
        /// Worked --> Stopped or Error or Others.
        /// </summary>
        /// <returns></returns>
        public override ErrorCode StopServer()
        {
            // do something...

            // finished
            this.transServer.SetState(this.transServer.GetStoppedState());
            return ErrorCode.NoError;
        }
    }

    internal class ErrorState : State
    {
        public ErrorState(TransServer ts)
        {
            this.transServer = ts;
        }

        public override ErrorCode StartServer()
        {
            return ErrorCode.UnknowError;
        }

        public override ErrorCode StopServer()
        {
            return ErrorCode.UnknowError;
        }
    }

    public class TransServer
    {
        State stoppedState;
        internal State GetStoppedState()
        {
            return stoppedState; 
        }
        State initState;
        internal State GetInitState()
        {
            return initState; 
        }
        State workingState;
        internal State GetWorkingState()
        {
            return workingState; 
        }
        State errorState;
        internal State GetErrorState()
        {
            return errorState; 
        }

        State state;
        /// <summary>
        /// 设置当前状态
        /// </summary>
        internal void SetState(State value)
        {
            state = value;
        }
        /// <summary>
        /// 默认构造方法
        /// </summary>
        public TransServer()
        {
            stoppedState = new StoppedState(this);
            initState = new InitState(this);
            workingState = new WorkingState(this);
            errorState = new ErrorState(this);

            state = stoppedState;
        }

        public ErrorCode StartServer()
        {
            ErrorCode rv = state.StartServer();
            return rv;
        }

        public ErrorCode StopServer()
        {
            ErrorCode rv = state.StopServer();
            return rv;
        }
    }


 

    /// <summary>
    /// 错误码
    /// </summary>
    public enum ErrorCode
    {
        NoError = 0,
        AlreadyClosed,
        WaitUntilInitialed,
        AlreadyStarted,
        UnknowError,
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值