In this article I am going to explain the State Pattern. It is one among the 23
design patters and provides a good solution to a common problem.
As usual the pattern starts with a challenge and then implementing the solution
using the pattern.
Challenge
You are working on a job processing application. The application can handle only
1 job at a time. So when a new job arrives the system response will be weird.
How to provide a better approach to the above problem?
Definition
Allow an object to alter its behavior when its internal state changes. The
object will appear to change its class."
Implementation
An enumeration named JobState is used to define the states used in our
application.
public
enum JobState
{
Ready,
Busy
}
This enumeration is used inside our Job class.
public
class Job
{
private
JobState _State;
public JobState
State
{
get {
return _State; }
set
{
_State = value;
if (OnJobStateChanged !=
null)
OnJobStateChanged(this,
_State);
}
}
public bool
AddJob(object jobParameter)
{
switch (State)
{
case
JobState.Ready:
{
DoJob();
return true;
}
case
JobState.Busy:
{
return false;
}
}
return false;
}
}
In the AddJob() method we can see the new job is taken only if the JobState is
in Ready state. Here true will be returned by the method. If there is another
job running, then the new job will not be queued and false will be returned.
Thus the object Job changes the behavior based on the internal state.
Application
The associated application contains the classes we discussed.
On executing the windows application and clicking the Assign Job button, you can
see the following screen:
While a job is in process, we cannot add another job. If a try is made the
response is:
Summary
In this article we have seen about State Pattern. The attachment file contains
the source code of the application we have discuseed.