Sto combattendo con un po 'di codice e penso di aver finalmente ottenuto qualche codice di pattern di stato che funziona con i miei eventi .
Ho un sistema semplificato che funzionerà in questo modo:
QuestoèilmioprimotentativoconilcodicePatterndistatoegliesempichehotrovatoeranotropposempliciosemplicementenoncorrelatialmiotipodidispositivo.
D:Laclassedicontestodovrebbefaretuttoilcontrollodelleperiferichedeldispositivoolostatoattivodovrebbecontrollarledirettamente?Adesempio,guidaildisplay,leggiisensori,ecc.Perme,inentrambiicasifunzionerebbe,manonhoabbastanzaesperienzaquipersceglierecosaècorretto.
HodettoDIperchédevopassaretuttelemieperiferichenelcontesto,quindiinognistatoperfornireilcontrollo.Olihoappenapassatinelcontestoefacciolechiamatealcontestodallostatoattivo(menzionatosopra)?Percomelavedoio,lostatoattivoeilcontestocomunicanocostantementetralorotramiteDIpercontrollareildispositivo.
Sperochesiachiaro.
Codiceclassedelcontesto:
//context//thecontextwillcapturetheinterrupteventsanddelegatetheresponseclassModeContext{privateintrotationCount;privatestringdirection;privateStatestate;publicRotaryEncoderrotaryEncoderInstance;publicTlc5940Display;//publiceventNativeEventHandlerrotationEventHandler;//=null;publicModeContext(RotaryEncoderre,Tlc5940display){this.State=newMode1(this);rotaryEncoderInstance=re;rotaryEncoderInstance.RotationEventHandler+=OnRotationEvent;//attachtoContext'sHandlerrotaryEncoderInstance.MomentaryButtonEventHandler+=OnButtonEvent;Display=display;rotationCount=0;}publicvoidRunStateTask(){state.MainTask(this);}publicStateState{get{returnstate;}set{state=value;}//debugstatechange}//EventHandlerpublicvoidOnButtonEvent(uintclickCount,uintzero,DateTimetime){switch(clickCount){case0:state.OnButtonHold(this);break;case1:state.OnButtonSingleClick(this);break;//default://thrownewException("Something went wrong!");
// break;
}
}
public void OnRotationEvent(uint data1, uint data2, DateTime time)
{
rotationCount++;
if (data1 == 1)
{
direction = "Clockwise";
state.OnCWRotationEvent(this);
}
else
{
direction = "Counter-Clockwise";
state.OnCCWRotationEvent(this);
}
//Debug.Print(rotationCount.ToString() + ": " + direction + " Context Mode Rotation Event Fired!");
}
}
Esempio di classe di stato:
class Mode1 : State//, IDisposable
{
public Mode1(ModeContext mode): base(mode)
{
Display = mode.Display;
}
public override void MainTask(ModeContext mode)
{
Debug.Print("Mode1 Main Task Running...");
//read Sensor
//display the value to Display
//let the context determine how to display it??
//or call a method in the context that encapsulated all of it's functions?
//Thread.Sleep(500);
}
#region event handlers
public override void OnCCWRotationEvent(ModeContext mode)
{
//change state
mode.State = new Mode2(mode);
Debug.Print("Changing State");
}
public override void OnCWRotationEvent(ModeContext mode)
{
//change state
Debug.Print("Changing State");
mode.State = new Mode0(mode);
}
public override void OnButtonSingleClick(ModeContext mode)
{
Debug.Print("Mode1: Single Click!");
}
public override void OnButtonHold(ModeContext mode)
{
Debug.Print("Mode1: Press and Hold Detected!");
}
#endregion
}