状态模式作业

任务的要求如下:

下面是设计的UML类图:

下面是部分代码片段:

 1 /// <summary>
 2     /// 环境类
 3     /// </summary>
 4     public class Account
 5     {
 6         public AccountState State { set; get; }
 7         public string Owner { set; get; }
 8         public double Balance { set; get; }
 9
10         public Account(string owner, double initialAmount)
11         {
12             Owner = owner;
13             Balance = initialAmount;
14             State = new VistorState(this);  //设置初始状态
15         }
16
17         public void SetBalance(double amount)
18         {
19             Balance = amount;
20
21         }
22
23         //存款
24         public void Deposit(double amount)
25         {
26             Console.WriteLine("存入" + amount);
27             State.Deposit(amount);
28             Console.WriteLine("用户状态变为" + State._Statename);
29         }
30
31         //消费
32         public void Shopping(double amount)
33         {
34             Console.WriteLine("消费" + amount);
35             State.Shopping(amount);
36             Console.WriteLine("用户状态变为" + State._Statename);
37         }
38
39
40     }
 1  /// <summary>
 2     /// 抽象状态类
 3     /// </summary>
 4     public abstract class AccountState
 5     {
 6         protected Account _account;
 7         public string _Statename;
 8
 9         public abstract void Deposit(double amount);
10         public abstract void Shopping(double amount);
11         public abstract void StateCheck();
12     }
 1  /// <summary>
 2     /// 访客状态类
 3     /// </summary>
 4     public class VistorState:AccountState
 5     {
 6         public VistorState(Account account)
 7         {
 8             _account = account;
 9             _Statename = "访客账户";
10             StateCheck();  //默认的检查
11         }
12
13         //取款
14         public override void Deposit(double amount)
15         {
16             _account.Balance += amount;
17             Console.WriteLine(_account.Owner + " 向账户中存款" + amount + "元,存款后的账户余额为:" + _account.Balance);
18             StateCheck();
19         }
20
21         //消费
22         public override void Shopping(double amount)
23         {
24             double newBalance = _account.Balance - amount;
25             if (newBalance > 0)
26             {
27                 _account.Balance -= amount;
28                 Console.WriteLine(_account.Owner + "在《访客服务》中消费" + amount + "元,账户余额:" + _account.Balance);
29             }
30             else
31             {
32                 Console.WriteLine("您的账户余额不足,请充值。");
33             }
34             StateCheck();
35         }
36
37         //检查用户状态
38         public override void StateCheck()
39         {
40             if (_account.Balance > 100 && _account.Balance < 1000)
41             {
42                 //会员用户状态
43                 _account.State = new MemberState(_account);
44             }
45             else if (_account.Balance > 1000)
46             {
47                 //贵宾用户状态
48                 _account.State = new VIPState(_account);
49             }
50         }
51     }
 1  /// <summary>
 2     /// 会员状态类
 3     /// </summary>
 4     public class MemberState:AccountState
 5     {
 6         public MemberState(Account account)
 7         {
 8             _account = account;
 9             _Statename = "会员账户";
10         }
11
12         //取款
13         public override void Deposit(double amount)
14         {
15             _account.Balance += amount;
16             Console.WriteLine(_account.Owner + " 向账户中存款" + amount + "元,存款后的账户余额为:" + _account.Balance);
17             StateCheck();
18         }
19
20         //消费
21         public override void Shopping(double amount)
22         {
23             double newBalance = _account.Balance - amount;
24             if (newBalance > 0)
25             {
26                 _account.Balance -= amount;
27                 Console.WriteLine(_account.Owner + "在《会员服务》中消费" + amount + "元,账户余额:" + _account.Balance);
28             }
29             else
30             {
31                 Console.WriteLine("您的账户余额不足,请充值。");
32             }
33             StateCheck();
34         }
35
36         //检查用户状态
37         public override void StateCheck()
38         {
39             if (_account.Balance > 0 && _account.Balance < 100)
40             {
41                 //访客用户状态
42                 _account.State = new VistorState(_account);
43             }
44             else if (_account.Balance > 1000)
45             {
46                 //贵宾用户状态
47                 _account.State = new VIPState(_account);
48
49             }
50         }
51     }
 1 /// <summary>
 2     /// 贵宾状态类
 3     /// </summary>
 4     public class VIPState:AccountState
 5     {
 6         public VIPState(Account account)
 7         {
 8             _account = account;
 9             _Statename = "贵宾账户";
10         }
11
12         //取款
13         public override void Deposit(double amount)
14         {
15             _account.Balance += amount;
16             Console.WriteLine(_account.Owner + " 向账户中存款" + amount + "元,存款后的账户余额为:" + _account.Balance);
17             StateCheck();
18         }
19
20         //消费
21         public override void Shopping(double amount)
22         {
23             double newBalance = _account.Balance - amount;
24             if (newBalance > 0)
25             {
26                 _account.Balance -= amount;
27                 Console.WriteLine(_account.Owner + "在《贵宾服务》中消费" + amount + "元,账户余额:" + _account.Balance);
28             }
29             else
30             {
31                 Console.WriteLine("您的账户余额不足,请充值。");
32             }
33             StateCheck();
34         }
35
36         //检查用户状态
37         public override void StateCheck()
38         {
39             if (_account.Balance > 0 && _account.Balance < 100)
40             {
41                 //访客用户状态
42                 _account.State = new VistorState(_account);
43             }
44             else if (_account.Balance > 100&&_account.Balance<1000)
45             {
46                 //会员用户状态
47                 _account.State = new MemberState(_account);
48             }
49         }
50     }
/// <summary>
    /// 客户端代码
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account("王大锤", 99);
            Console.WriteLine("开户成功。姓名:" + account.Owner + " 初始金额:" + account.Balance + " 账户类型:" + account.State._Statename);
            Console.WriteLine("----------------------------");

            account.Deposit(20);
            Console.WriteLine("-----------------------------");

            account.Shopping(30);
            Console.WriteLine("-----------------------------");

            account.Deposit(9999);
            Console.WriteLine("------------------------------");

            Console.ReadLine();
        }
    }

下面是程序的结果:

时间: 2024-12-11 10:18:12

状态模式作业的相关文章

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

设计模式整理_状态模式

状态模式允许对象在内部状态改变的时候,改变它的行为,对象看起来好像修改了它的类.因为这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,而行为会随着内部状态而改变. 在状态模式中,Context内部持有状态,State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,各个状态可以互相替换.具体状态实现状态接口,所以当Context改变状态的时候,行为也跟着改变.而不管在什么时候,只要有人调用Context的具体方法,它就会用来委托状态处理,下面用具体事例

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

第十六章 状态模式

好处:将与特定状态相关的行为局部化,并将不同状态的行为分割开来. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式. /** * Created by hero on 16-4-4. */ public abstract class State { public abstract void handle(Context context); } /** * Created by hero on 16-4-4. */ public class Con

23状态模式

 1状态模式的核心内容是: A:状态类 B:工作类 2状态模式的作用:通过状态值自动跳转到要执行的类. 3状态模式具体描述 状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为. 这个对象看上去象是改变了它的类一样.状态模式把所研究的对象的行 为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的 一个子类.状态模式的意图是让一个对象在其内部状态改变的时候, 其行为也随之改变.状态模式需要对每一个系统可能取得的状态创立一个状态类的 子类.当系统的状态变化时,系统便改变所选的子

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

State状态模式(C++实现)

状态模式:状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为.看起来就像是改变了它的类一样. 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. 类图如下图所示 State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为.ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为.Context类,维护一个ConcreteState子类

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以