设计模式——状态模式

名称State
结构State.gif
意图允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性
  • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
Code Example
  1 None.gif //  State
  2 None.gif
  3 None.gif //  Intent: "Allow an object to alter its behavior when its internal state 
  4 None.gif //  changes. The object will appear to change its class". 
  5 None.gif
  6 None.gif //  For further information, read "Design Patterns", p305, Gamma et al.,
  7 None.gif //  Addison-Wesley, ISBN:0-201-63361-2
  8 None.gif
  9 ExpandedBlockStart.gifContractedBlock.gif /**/ /* Notes:
 10InBlock.gif * 
 11InBlock.gif * A finite state machine is an appropriate construct to use for a class whose
 12InBlock.gif * reaction to stimuli depends on previous behavior. In the past, each 
 13InBlock.gif * method in the class was coded as a switch statement, switching on the state. 
 14InBlock.gif * If a new state was added, then each method had to be edited. 
 15InBlock.gif * 
 16InBlock.gif * With the state design pattern, functionality specific to a state is placed 
 17InBlock.gif * in a helper class, and the main class delegates those methods that are 
 18InBlock.gif * state-specific to such helper classes.   
 19InBlock.gif * 
 20ExpandedBlockEnd.gif */

 21 None.gif 
 22 None.gif namespace  State_DesignPattern
 23 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 24InBlock.gif    using System;
 25InBlock.gif
 26InBlock.gif    abstract class State 
 27ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 28InBlock.gif        protected string strStatename;        
 29InBlock.gif
 30InBlock.gif        abstract public void Pour();
 31InBlock.gif        // do something state-specific here
 32ExpandedSubBlockEnd.gif    }

 33InBlock.gif
 34InBlock.gif    class OpenedState : State 
 35ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{        
 36InBlock.gif        public OpenedState ()
 37ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 38InBlock.gif            strStatename = "Opened";
 39ExpandedSubBlockEnd.gif        }

 40InBlock.gif        override public void Pour()
 41ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 42InBlock.gif            Console.WriteLine("dot.gifpouringdot.gif");
 43InBlock.gif            Console.WriteLine("dot.gifpouringdot.gif");
 44InBlock.gif            Console.WriteLine("dot.gifpouringdot.gif");
 45ExpandedSubBlockEnd.gif        }

 46ExpandedSubBlockEnd.gif    }

 47InBlock.gif    
 48InBlock.gif    class ClosedState : State 
 49ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{        
 50InBlock.gif        public ClosedState()
 51ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 52InBlock.gif            strStatename = "Closed";
 53ExpandedSubBlockEnd.gif        }

 54InBlock.gif        override public void Pour()
 55ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 56InBlock.gif            Console.WriteLine("ERROR - bottle is closed - cannot pour");
 57ExpandedSubBlockEnd.gif        }

 58ExpandedSubBlockEnd.gif    }

 59InBlock.gif
 60InBlock.gif    class ContextColaBottle 
 61ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 62ExpandedSubBlockStart.gifContractedSubBlock.gif        public enum BottleStateSetting dot.gif{
 63InBlock.gif            Closed,
 64InBlock.gif            Opened
 65ExpandedSubBlockEnd.gif        }
;
 66InBlock.gif
 67InBlock.gif        // If teh state classes had large amounts of instance data,
 68InBlock.gif        // we could dynamically create them as needed - if this demo
 69InBlock.gif        // they are tiny, so we just  create them as data members
 70InBlock.gif        OpenedState openedState = new OpenedState();
 71InBlock.gif        ClosedState closedState = new ClosedState();
 72InBlock.gif
 73InBlock.gif        public ContextColaBottle ()
 74ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 75InBlock.gif            // Initialize to closed
 76InBlock.gif            CurrentState = closedState;
 77ExpandedSubBlockEnd.gif        }

 78InBlock.gif
 79InBlock.gif        private State CurrentState;
 80InBlock.gif        
 81InBlock.gif        public void SetState(BottleStateSetting newState)
 82ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 83InBlock.gif            if (newState == BottleStateSetting.Closed)
 84ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 85InBlock.gif                CurrentState = closedState;
 86ExpandedSubBlockEnd.gif            }

 87InBlock.gif            else 
 88ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 89InBlock.gif                CurrentState = openedState;
 90ExpandedSubBlockEnd.gif            }

 91ExpandedSubBlockEnd.gif        }

 92InBlock.gif
 93InBlock.gif        public void Pour()
 94ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 95InBlock.gif            CurrentState.Pour();
 96ExpandedSubBlockEnd.gif        }
    
 97ExpandedSubBlockEnd.gif    }

 98InBlock.gif
 99ExpandedSubBlockStart.gifContractedSubBlock.gif      /**//// <summary>
100InBlock.gif    ///    Summary description for Client.
101ExpandedSubBlockEnd.gif    /// </summary>

102InBlock.gif    public class Client
103ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
104InBlock.gif        public static int Main(string[] args)
105ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
106InBlock.gif            ContextColaBottle contextColaBottle = new ContextColaBottle();
107InBlock.gif
108InBlock.gif            Console.WriteLine("initial state is closed");
109InBlock.gif
110InBlock.gif            Console.WriteLine("Now trying to pour");
111InBlock.gif              contextColaBottle.Pour();
112InBlock.gif
113InBlock.gif            Console.WriteLine("Open bottle");
114InBlock.gif            contextColaBottle.SetState(ContextColaBottle.BottleStateSetting.Opened);
115InBlock.gif
116InBlock.gif            Console.WriteLine("Try to pour again");
117InBlock.gif            contextColaBottle.Pour();
118InBlock.gif
119InBlock.gif            return 0;
120ExpandedSubBlockEnd.gif        }

121ExpandedSubBlockEnd.gif    }

122ExpandedBlockEnd.gif}

123 None.gif
124 None.gif

转载于:https://www.cnblogs.com/DarkAngel/archive/2005/08/17/216494.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值