状态模式(State Pattern)

原创 2012年03月27日 22:31:56

状态模式(State Pattern):
当一个对象的内在状态变化时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件过于复杂时的情况。把状态的判断逻辑移到表示
不同状态的一系列类当中,可以把复杂的判断逻辑简单化。

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

    /// <summary>
    /// Context类:引发状态改变的类
    /// 维护一个ConcreteState子类的实例,这个实例定义当前状态
    /// </summary>
    class Context
    {
        private State _state;

        public State State
        {
            get { return _state; }
            set { _state = value; }
        }

        public Context(State state)
        {
            this._state = state;
        }

        public void Request()
        {
            _state.Handle(this);
        }
    }

    /// <summary>
    /// 具体的状态类,每一个子类实现一个与Context的一个状态相关的行为
    /// 往往设置下一个状态
    /// </summary>
    class ConcreteStateA:State
    {

        public override void Handle(Context context)
        {
            //设置下一个状态是B
            context.State = new ConcreteStateB();
        }
    }

    class ConcreteStateB : State
    {
        public override void Handle(Context context)
        {
            //设置下一个状态是A
            context.State = new ConcreteStateA();
        }
    }

    class Program
    {
        static void Main()
        {
            //设置初始状态为A
            Context c = new Context(new ConcreteStateA());

            //不断的请求,同时更改状态
            c.Request();
            c.Request();
            c.Request();
        }
    }

应用:
1.对象的行为依赖于它的状态(属性)并且它必须可以根据它的状态而改变它的行为。
2.操作很多部分都带有与对象状态有关的大量条件语句。
状态模式在工作流或游戏等各种系统中大量使用。例如在政府OA系统中,一个公文的审批就包含很多状态:
未办、正在处理、正在办理、正在批示、正在审批和已经完成

实例:银行账户分类
允许账户因它的余额不同而有不同的分类,分为RedState(红色状态)、SilverState(银色状态)、GoldState(金色状态)
这些状态表示了账户是否透支、新账户、常务账户

 

/// <summary>
    /// 抽象状态类
    /// </summary>
    public abstract class State
    {
        protected Account account;
        //金额
        protected double balance;
        //利息
        protected double interest;
        //最低限额
        protected double lowerLimit;
        //最高限额
        protected double upperLimit;

        /// <summary>
        /// 账户类属性
        /// </summary>
        public Account Account
        {
            get { return this.account; }
            set { this.account = value; }
        }
        /// <summary>
        /// 账户余额
        /// </summary>
        public double Balance
        {
            get { return this.balance; }
            set { this.balance = value; }
        }

        /// <summary>
        /// 初始化
        /// </summary>
        abstract public void Initialize();
        /// <summary>
        /// 存款
        /// </summary>
        /// <param name="amount"></param>
        abstract public void Deposit(double amount);
        /// <summary>
        /// 取款
        /// </summary>
        /// <param name="amount"></param>
        abstract public void WithDraw(double amount);
        /// <summary>
        /// 付利息
        /// </summary>
        abstract public void PayInterest();
        /// <summary>
        /// 状态变化
        /// </summary>
        abstract public void StateChangeCheck();
    }

 

 

/// <summary>
    /// 具体状态类
    /// 红色状态:透支状态
    /// </summary>
    public class RedState:State
    {
        double serviceFee;

        public RedState(State state)
        {
            this.balance = state.Balance;
            this.account = state.Account;
            Initialize();
        }
        public override void Initialize()
        {
            //透支状态没有利息,最低额度为负100,最高为0,手续费15
            this.interest = 0.0;
            this.lowerLimit = -100;
            this.upperLimit = 0.0;
            this.serviceFee = 15.00;
        }

        public override void Deposit(double amount)
        {
            this.balance += amount;
            StateChangeCheck();
        }

        public override void WithDraw(double amount)
        {
            amount = amount - serviceFee;
            Console.WriteLine("没有存款可供支取!");
        }

        public override void PayInterest()
        {
            Console.WriteLine("没有存款,银行不会支付利息!");
        }

        public override void StateChangeCheck()
        {
            //当有存款是,状态变为银色
            if (this.balance > upperLimit)
            {
                account.State = new SilverState(this);
            }
        }
    }

 

public class SilverState:State
    {
        public SilverState(State state)
        {
            this.balance = state.Balance;
            this.account = state.Account;
            Initialize();
        }
        public SilverState(double balance,Account account)
        {
            this.balance = balance;
            this.account = account;
            Initialize();
        }
        public override void Initialize()
        {
            this.interest = 0.0;
            this.lowerLimit = 0.0;
            this.upperLimit = 1000.00;
        }

        public override void Deposit(double amount)
        {
            this.balance += amount;
            StateChangeCheck();
        }

        public override void WithDraw(double amount)
        {
            balance -= amount;
            StateChangeCheck();
        }

        public override void PayInterest()
        {
            balance += interest * balance;
            StateChangeCheck();
        }

        public override void StateChangeCheck()
        {
            //当存款小于0时转为RedState状态;当大于当前最大限额时,转为金色状态
            if (balance < lowerLimit)
            {
                account.State = new RedState(this);
            }
            else if (balance > upperLimit)
            {
                account.State = new GoldState(this);
            }

        }
    }

 

public class GoldState:State
    {
        public GoldState(State state)
        {
            this.balance = state.Balance;
            this.account = state.Account;
            Initialize();
        }

        public override void Initialize()
        {
            interest = 0.05;
            lowerLimit = 1000.0;
            upperLimit = 10000000000000000.0;
        }

        public override void Deposit(double amount)
        {
            this.balance += amount;
            StateChangeCheck();
        }

        public override void WithDraw(double amount)
        {
            balance -= amount;
            StateChangeCheck();
        }

        public override void PayInterest()
        {
            balance += interest * balance;
            StateChangeCheck();
        }

        public override void StateChangeCheck()
        {
            if (balance < 0)
            {
                account.State = new RedState(this);
            }
            else if (balance < lowerLimit)
            {
                account.State = new SilverState(this);
            }
        }
    }

 

/// <summary>
    /// 账户类,维护一个具体状态类实例对象
    /// 包含有状态类属性
    /// </summary>
    public class Account
    {
        private State _state;
        private string owner;

        public Account(string owner)
        {
            //初始状态为银色状态
            this.owner = owner;
            this._state = new SilverState(0.0, this);
        }

        /// <summary>
        /// 状态属性
        /// </summary>
        public State State
        {
            get { return this._state; }
            set { this._state = value; }
        }

        public double Balance
        {
            get { return _state.Balance; }
        }

        public void Deposit(double amount)
        {
            _state.Deposit(amount);
            Console.WriteLine("存入 {0:C} --- ",amount);
            Console.WriteLine("现存余额:{0:C}---",this.Balance);
            Console.WriteLine("当前状态:{0}",this._state);
            Console.WriteLine("");
        }

        public void WithDraw(double amount)
        {
            _state.WithDraw(amount);
            Console.WriteLine("取出:{0:C}---",amount);
            Console.WriteLine("现存余额:{0:C}---", this.Balance);
            Console.WriteLine("当前状态:{0}", this._state);
            Console.WriteLine("");
        }

        public void PayInterest()
        {
            _state.PayInterest();
            Console.WriteLine("银行利息支付 ----");
            Console.WriteLine("现存余额:{0:C}---", this.Balance);
            Console.WriteLine("当前状态:{0}", this._state);
            Console.WriteLine("");
        }
    }

 

客户端调用:

//状态模式
            Account account = new Account("张三");
            account.Deposit(500);
            account.Deposit(300);
            account.Deposit(650);
            account.PayInterest();
            account.WithDraw(2000);
            account.WithDraw(1000);
            Console.WriteLine();

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解本文地址: http://blog.csdn.net/caroline_wendy状态模式(state pattern): 允许对象在内部状态改变时改变它的...
  • u012515223
  • u012515223
  • 2014年07月11日 17:42
  • 2149

"围观"设计模式(21)--行为型之状态模式(State Pattern)

状态模式--允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。----百度百科 个人理解 状态模式应该说可以理解为某种状态下,程序的执行流程可能会发生变化,类...
  • wangyang1354
  • wangyang1354
  • 2016年06月13日 15:11
  • 3456

JAVA设计模式之 状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状...
  • l416112167
  • l416112167
  • 2014年11月12日 23:48
  • 2702

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城...
  • u012401711
  • u012401711
  • 2016年09月26日 23:45
  • 3111

状态模式----State Pattern

状态模式
  • huaishu
  • huaishu
  • 2017年07月31日 15:44
  • 94

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

状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 此模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。 状态模式和策略模式...
  • MidnightIII
  • MidnightIII
  • 2011年03月26日 14:56
  • 201

The State Pattern 状态模式

A little known fact: the Strategy and State Patterns were twins separated at birth. As you know, the...
  • EVIL1992
  • EVIL1992
  • 2014年04月04日 14:22
  • 998

【设计模式】状态模式(State Pattern)

状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 ...
  • MR_XuZhe
  • MR_XuZhe
  • 2017年11月29日 11:21
  • 56

状态模式(State Design Pattern)

以此回顾《设计模式之禅》及其他设计模式书籍、视频中的状态模式。 什么是状态模式? Allow an object to alter its behavior when its internal s...
  • Liukx940818
  • Liukx940818
  • 2016年05月15日 16:21
  • 482

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

状态模式(State Pattern) 概念:状态模式 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 在软件设计中,我们经常会遇需要编写有很多状态的程序。最简单的如乘坐电梯程...
  • wwh578867817
  • wwh578867817
  • 2016年06月01日 01:08
  • 3484
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:状态模式(State Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)