Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
| 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 } |
| 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()); } } |
| 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; } } |
| 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)); } |