C#设计模式之十八状态模式(State Pattern)【行为型】
一、引言 2.4、模式的组成 ?? ? ??? 可以看出,在状态模式的结构图有以下角色: ??? (1)、环境角色(Context):也称上下文,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。 ? ??? (2)、抽象状态角色(State):定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。 ??? (3)、具体状态角色(ConcreteState):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。 ???? 在状态模式结构中需要理解环境类与抽象状态类的作用: ? ???? 环境类实际上就是拥有状态的对象,环境类有时候可以充当状态管理器(State Manager)的角色,可以在环境类中对状态进行切换操作。 ???? 抽象状态类可以是抽象类,也可以是接口,不同状态类就是继承这个父类的不同子类,状态类的产生是由于环境类存在多个状态,同时还满足两个条件:这些状态经常需要切换,在不同的状态下对象的行为不同。因此可以将不同对象下的行为单独提取出来封装在具体的状态类中,使得环境类对象在其内部状态改变时可以改变它的行为,对象看起来似乎修改了它的类,而实际上是由于切换到不同的具体状态类实现的。由于环境类可以设置为任一具体状态类,因此它针对抽象状态类进行编程,在程序运行时可以将任一具体状态类的对象设置到环境类中,从而使得环境类可以改变内部状态,并且改变行为。 2.5、状态模式的代码实现 ??? 状态模式在我们的现实生活中也有类似的例子,例如:在我们上网购买商品的过程中,就可以查看订单的随时状态。对于商家来说,订单的状态不同,也会允许客户有不同的动作要求,比如:订单在已经处于发货状态,此订单是不能退货的。如果订单在备货阶段,客户是可以换货或者退货的。如果我们的订单已经发货了,您就等着接收货物吧,如果货物有质量问题,可以拒签,或者顺利完成交易,今天我们就以订单为例来说明状态模式的实现。实现代码如下: 1 namespace 状态模式的实现 2 { 3 //环境角色---相当于Context类型 4 public sealed class Order 5 { 6 private State current; 7 8 public Order() 9 { 10 工作状态初始化为尚无的工作状态,等待接单中 11 current = new WaitForAcceptance(); 12 IsCancel = false; 13 } 14 private double minute; 15 Minute 16 17 get { return minute; } 18 set { minute = value; } 19 20 21 bool IsCancel { get; set; } 22 23 bool finish; 24 TaskFinished 25 26 finish; } 27 set { finish = 28 29 void SetState(State s) 30 31 current = s; 32 33 Action() 34 35 current.Process(this); 36 37 } 38 39 抽象状态角色---相当于State类型 40 interface State 41 42 处理订单 43 Process(Order order); 44 45 46 等待受理--相当于具体状态角色 47 WaitForAcceptance : State 48 49 Process(Order order) 50 51 System.Console.WriteLine("我们开始受理,准备备货!" 52 if (order.Minute < 30 && order.IsCancel) 53 { 54 System.Console.WriteLine(接受半个小时之内,可以取消订单! 55 order.SetState( CancelOrder()); 56 order.Action(); 57 } 58 order.SetState( AcceptAndDeliver()); 59 order.TaskFinished = 60 order.Action(); 61 62 63 64 受理发货---相当于具体状态角色 65 AcceptAndDeliver : State 66 67 68 69 System.Console.WriteLine(我们货物已经准备好,可以发货了,不可以撤销订单! 70 71 72 System.Console.WriteLine( 73 order.SetState( 74 75 76 if (order.TaskFinished==) 77 78 order.SetState( ConfirmationReceipt()); 79 80 81 82 83 84 确认收货---相当于具体状态角色 85 ConfirmationReceipt : State 86 87 88 89 System.Console.WriteLine(检查货物,没问题可以就可以签收! 90 order.SetState( Success()); 91 order.TaskFinished = 92 93 94 95 96 交易成功---相当于具体状态角色 97 Success : State 98 99 100 101 System.Console.WriteLine(订单结算102 order.TaskFinished = true103 104 105 106 取消订单---相当于具体状态角色 107 CancelOrder : State 108 109 110 111 System.Console.WriteLine(检查货物,有问题,取消订单!112 order.TaskFinished = 113 114 115 116 117 Client 118 119 static Main(String[] args) 120 121 订单 122 Order order = Order(); 123 order.Minute = 9124 125 可以取消订单 126 order.IsCancel = 127 order.Minute = 20128 129 order.Minute = 33130 131 order.Minute = 43132 133 134 Console.Read(); 135 136 137 }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- cocos2d-x android 直接加载下载到sd的zip里的资源文件(二)
- c – std :: unique_ptr删除函数,initializer_list – 驱动
- PostgreSQL与Linux内核版本
- Flash反编译软件asv2011英文绿色版
- Nand Flash管理算法介绍之垃圾回收类型介绍
- C – 构造函数调用构造函数
- could not get batchedbridge, make sure your bundle is p
- c# – 每次使用新的guid索引时,如何在集合属性上获取验证消
- c# – 编写高度复杂的业务/数学规则的最佳方法
- 在Postgresql中执行upsert时,在ON CONFLICT子句中未使用部分