Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

12 avril 2014 6 12 /04 /avril /2014 18:07

 

State.png
L’interface , on pourrait aussi utiliser une classe abstraite et une énumération indiquant l’état clairement .
  public interface IState 
    {
        bool CanDoWork();
        void DoWork(Context context);
        Status Status { get; }
    } 
// cela pourrait être par exemple New,Canceled,Shipped etc. 
    public enum Status 
    {
        StateA,
        StateB
    }
Les états possibles, par exemple deux états A et B
  public class StateA : IState 
    {
        public Status Status
        {
            get { return Status.StateA ; }
        }
        public bool CanDoWork()
        {
            return false;
        }
        public void DoWork(Context context)
        {
            // Variante 
            //if (!CanDoWork()) 
            //    throw new NotImplementedException("message"); 
            // ou 
            context.Change(new StateB());
        }
    }
    public class StateB : IState 
    {
        public Status Status
        {
            get { return Status.StateB; }
        }
        public bool CanDoWork()
        {
            return true;
        }
        public void DoWork(Context context)
        {
            //... 
            context.Change(new StateA());
        }
    }
La classe avec laquelle on va réellement intéragir, cela pourrait être par exemple une classe Order avec plusieurs états tels que OrderNewState, OrderCanceledState,OrderShippedState …
public class Context 
    {
        private IState _state;
     

        public Status Status

        {

            get { return _state.Status; }

        }

        public Context(IState state)
        {
            this._state = state;
        }
        public bool CanDoWork()
        {
            return _state.CanDoWork();
        }
        public void DoWork()
        {
            _state.DoWork(this);
        }

        internal void Change(IState state)
        {
            this._state = state;
            RaiseStateChanged(_state);
        }
        public event EventHandler<StateChangedEventArgs> StateChanged;
        private void RaiseStateChanged(IState state)
        {
            EventHandler<StateChangedEventArgs> handler = StateChanged;
            if (handler != null)
                handler(this, new StateChangedEventArgs(state));
        }
    }
    public class StateChangedEventArgs 
    {
        private IState _state;
        public IState State
        {
            get { return _state; }
        }
        public StateChangedEventArgs(IState state)
        {
            this._state = state;
        }
    }
Utilisation
private void button1_Click(object sender, EventArgs e)
        {
            Context context = new Context(new StateA());
            context.StateChanged += context_StateChanged;
            context.DoWork();// l'état passe à StateB 
            context.DoWork();// l'état passe à StateA 
        }
        private void context_StateChanged(object sender, StateChangedEventArgs e)
        {
            MessageBox.Show(string.Format("l'état courant est : {0} ({1:T}) ",e.State,DateTime.Now));
        } 

Partager cet article

Repost 0
Published by Romagny13 - dans Design patterns
commenter cet article

commentaires