23种设计模式-19-状态者模式

用户:

/// <summary>
    /// 用户
    /// </summary>
    public class Person
    {
        public Person()
        {
            this.State = new NewState(0, this);
        }

        public State State { get; set; }

        /// <summary>
        /// 存钱
        /// </summary>
        /// <param name="money"></param>
        public void SaveMoney(decimal money)
        {
            this.State.SaveMoney(money);
            Show();
        }

        /// <summary>
        /// 取钱
        /// </summary>
        /// <param name="money"></param>
        public void GetMoney(decimal money)
        {
            this.State.GetMoney(money);
            Show();
        }

        /// <summary>
        /// 查看获得的利息
        /// </summary>
        public void ShowInterest()
        {
            this.State.ShowInterest();
            Show();
        }

        public void Show()
        {
            Console.WriteLine("当前余额:{0}", CoreService.MoneyFormat(this.State.Money));
            Console.WriteLine("当前利率:{0}", this.State.Rate);
            Console.WriteLine("当前状态:{0}", this.State.GetType().Name);
        }

 

状态抽象类:

public abstract class State
    {
        /// <summary>
        /// 用户
        /// </summary>
        public Person Person { get; set; }

        /// <summary>
        /// 余额
        /// </summary>
        public decimal Money { get; set; }

        /// <summary>
        /// 利率
        /// </summary>
        public decimal Rate { get; set; }

        /// <summary>
        /// 下限
        /// </summary>
        public decimal Min { get; set; }

        /// <summary>
        /// 上限
        /// </summary>
        public decimal Max { get; set; }

        /// <summary>
        /// 存钱
        /// </summary>
        /// <param name="money"></param>
        public abstract void SaveMoney(decimal money);

        /// <summary>
        /// 取钱
        /// </summary>
        /// <param name="money"></param>
        public abstract void GetMoney(decimal money);

        /// <summary>
        /// 查看获得的利息
        /// </summary>
        public abstract void ShowInterest();

        public abstract void ValidateStateChange();

三种状态:

1.

/// <summary>
    /// 新开户
    /// </summary>
    public class NewState : State
    {
        public NewState(decimal money, Person person)
        {
            this.Money = money;
            this.Person = person;
            this.Rate = Convert.ToDecimal(0.002);
            this.Min = 0;
            this.Max = 1000;
        }

        public NewState(State state) : this(state.Money, state.Person)
        {

        }

        public override void SaveMoney(decimal money)
        {
            this.Money += money;
            ValidateStateChange();
        }

        public override void GetMoney(decimal money)
        {
            this.Money -= money;
            ValidateStateChange();
        }

        public override void ShowInterest()
        {
            Console.WriteLine("您是新开账户,当前可以获得的利息:{0}", CoreService.MoneyFormat(this.Money * this.Rate));
        }

        public override void ValidateStateChange()
        {
            if (this.Money < this.Min)
            {
                this.Person.State = new BadState(this);
            }
            else if (this.Money > this.Max)
            {
                this.Person.State = new SuperState(this);
            }
        }
    }

2.

/// <summary>
    /// 透支账户
    /// </summary>
    public class BadState : State
    {
        public BadState(State state)
        {
            this.Money = state.Money;
            this.Person = state.Person;
            this.Rate = Convert.ToDecimal(0.005);
            this.Min = Decimal.MinValue;
            this.Max = 0;
        }

        public override void SaveMoney(decimal money)
        {
            this.Money += money;
            ValidateStateChange();
        }

        public override void GetMoney(decimal money)
        {
            Console.WriteLine("您已透支{0}元,无法取钱", CoreService.MoneyFormat(this.Money));
        }

        public override void ShowInterest()
        {
            Console.WriteLine("您的账户已透支,您没有利息可以获得");
        }

        public override void ValidateStateChange()
        {
            if (this.Money >= this.Max)
            {
                this.Person.State = new NewState(this);
            }
        }
    }

3.

/// <summary>
    /// 高级账户
    /// </summary>
    public class SuperState : State
    {
        public SuperState(State state)
        {
            this.Money = state.Money;
            this.Person = state.Person;
            this.Rate = Convert.ToDecimal(0.005);
            this.Min = 1000;
            this.Max = Decimal.MaxValue;
        }

        public override void SaveMoney(decimal money)
        {
            this.Money += money;
            ValidateStateChange();
        }

        public override void GetMoney(decimal money)
        {
            this.Money -= money;
            ValidateStateChange();
        }

        public override void ShowInterest()
        {
            Console.WriteLine("您是高级账户,当前可以获得的利息:{0}", CoreService.MoneyFormat(this.Money * this.Rate));
        }

        public override void ValidateStateChange()
        {
            if (this.Money <= this.Min)
            {
                this.Person.State = new NewState(this);
            }
        }
    }

测试:

class Program
    {
        /// <summary>
        /// 状态者模式:
        /// 一个对象有多种不同的状态来表现出不同的形态
        /// 如果不停的用if else去判断的话,会导致程序的耦合性很高,而且不利于维护
        /// 所以此时拥有了状态者模式
        ///
        /// 此文中的例子:
        /// 用户的银行账户:
        /// 分为三个状态:
        /// 1.新开户:账户金额为0-1000,利息为0.2%
        /// 2.高级账户:账户余额为10000以上,利息为0.5%
        /// 3.透支账户:账户余额为0以下,利息为0
        /// 
        /// 状态公共的操作有:存钱,取钱,查询可以获得的利息费用
        /// 用户的操作有:存钱,取钱,查询可以获得的利息费用
        /// 用户的属性有:当前余额,当前利率
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var person = new Person();
            person.Show();
            Console.WriteLine("-------------------------------------------------");
            person.GetMoney(500);
            Console.WriteLine("-------------------------------------------------");
            person.GetMoney(100);
            Console.WriteLine("-------------------------------------------------");
            person.SaveMoney(888);
            Console.WriteLine("-------------------------------------------------");
            person.ShowInterest();
            Console.WriteLine("-------------------------------------------------");
            person.SaveMoney(20000);
            Console.WriteLine("-------------------------------------------------");
            person.ShowInterest();
            Console.WriteLine("-------------------------------------------------");
            Console.ReadKey();
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值