The reason for putting these two modes together is the relationship between C # statements. These two modes become easy or different.
Observer (observer)
Class Observer
{
Public Delegate Void Eventhandler (string State );
Public Event eventhandler changeevent;
Public Void Changestate (string state)
{
If (Changeevent ! = Null )
{
Changeevent (State );
}
}
}
Call Static Void Main ( String [] ARGs)
{
Observer obs = New Observer ();
Obs. changeevent + = New Observer. eventhandler (obs_changeevent );
Obs. changestate ( " Change " );
Console. Read ();
}
Static Void Obs_changeevent ( String State)
{
Console. writeline ("I see:" +State );
}
Running result
Iterator (iterator)
Classes that implement the ienumerable and ienumerator interfaces respectivelyPublic Class Tokens: ienumerable
{
Public String [] Elements;
Public Tokens ( String Source, Char [] Delimiters)
{
Elements=Source. Split (delimiters );
}
Public Ienumerator getenumerator ()
{
Return NewTokenenumerator (This);
}
}
Public Class Tokenenumerator: ienumerator
{
Private Int Position = - 1 ;
Private Tokens T;
Public Tokenenumerator (tokens T)
{
This. T=T;
}
Public Bool Movenext ()
{
If (Position < T. elements. Length - 1 )
{
Position++;
Return True;
}
Else
{
Return False;
}
}
Public Void Reset ()
{
Position= -1;
}
Public Object Current
{
Get
{
ReturnT. elements [position];
}
}
}
Call Static Void Main ( String [] ARGs)
{
Tokens = New Tokens ( " A, B, c " , New Char [] {','} );
Ienumerator iterator = Tokens. getenumerator ();
While (Iterator. movenext ())
{
String Token = Iterator. Current As String ;
If (Token ! = Null )
{
Console. writeline (token );
}
}
Console. Read ();
}
C # generic support makes iterator implementation better.
Result