Home
Core Java
Java
JDBC
Servlets
JSP
EJB
JMS
Struts
Spring
Hibernate
JSF
RMI
CORBA
J2ME
Performance
Tomcat
Weblogic
Design Patterns
Junit
XML
UML
DB2 & SQL
ANT
Free Gift
Contact Us

XML RSS
What is this?
Add to My Yahoo!
Add to My MSN
Add to Google
 

Behavorial Pattern

State Pattern

Your Ad Here

Creational patterns Structural patterns Behavioral pattern J2EE patterns
Abstract Factory Adapter  Chain of Responsibility
MVC 
Builder Bridge  Command  Business Delegate
Factory method Composite  Interpreter  Composite Entity
Prototype Decorator  Iterator  Data Access Object
Singleton Façade
Mediator  Front Controller

Flyweight  Memento  Intercepting Filter

Proxy  Observer  Service Locator


State  Transfer Object


Strategy 


Template Method



Visitor 

State Pattern



Define State pattern
An object's behavior change is represented by its member classes, which share the same super class.

Where to use & benefits
Need to control many states without using if-else or switch statements.
Use a class to represent a state, not a constant or something else.
Every state has to act in a similar manner.
Every state must be a subclass of the same super class.
Simplify and clarify the program.

Related patterns include
  • Flyweight, which explains when and how a state object can be shared.
  • Singleton which is often used with state pattern to ensure some state change is shared with class itself, not instances of the class.

Your Ad Here
Example of design pattern
To show the concept of State pattern, we use a simple command line program. If a GUI program is used, a mediator pattern or a flyweight pattern may be applied on it.

Users connect to a database to do some jobs. Users from Management department may focus on management. Users from Sales department may focus on sales information. Every connection has to perform similar functions like open, log and close. Suppose we have an abstract Connection class and have these functions listed. Thus, every subclass of Connection must implement these functions. We list three subclasses Management, Sales and Accounting for example, just to show the State pattern concept. The Controller class contains each state of connection. Its behavior is decided by another object, which is a Test class. All the details have been hidden from the Test class. Suppose we have a server which is a singleton. Which connection is made depends on the user. We use a Test class which makes a trigger from command line. In the real program, the trigger should be made by the user.

The following is a skeleton program.

abstract class Connection {
   public abstract void open();
   public abstract void close();
   public abstract void log();
}
class Accounting extends Connection {
   public void open() {
      System.out.println("open database for accounting");
   }
   public void close() {
      System.out.println("close the database");
   }
   public void log() {
      System.out.println("log activities");
   }
   //...
}
class Sales extends Connection {
   public void open() {
      System.out.println("open database for sales");
   }
   public void close() {
      System.out.println("close the database");
   }
   public void log() {
      System.out.println("log activities");
   }
   public void update() {
      //
   }
}
class Management extends Connection {
   public void open() {
      System.out.println("open database for management");
   }
   public void close() {
      System.out.println("close the database");
   }
   public void log() {
      System.out.println("log activities");
   }
   //...
}
class Controller {
   public static Accounting acct;
   public static Sales sales;
   public static Management manage;
   private static Connection current;
  
   Controller() {
       acct = new Accounting();
       sales = new Sales();
       manage = new Management();
   }
   public void makeAccountingConnection() {
       current = acct;
   }
   public void makeSalesConnection() {
       current = sales;
   }
   public void makeManagementConnection() {
       current = manage;
   }
   public void open() {
       current.open();
   }
   public void close() {
       current.close();
   }
   public void log() {
       current.log();
   }
}
class Test {
   String con;
   Controller controller;
   Test(String con) {
      controller = new Controller();
      //the following trigger should be made by the user
      if(con.equalsIgnoreCase("management"))
         controller.makeManagementConnection();
      if(con.equalsIgnoreCase("sales"))
         controller.makeSalesConnection();
      if(con.equalsIgnoreCase("accounting"))
             controller.makeAccountingConnection();
      controller.open();
      controller.log();
      controller.close();
   }
}
class Server {
   public static Test test;
   public static void main(String[] args) {
      new Test(args[0]);  
   }
}

When we run the program with different connection, we will invoke the program in the following printout:

%java Server management
open database for management
log activities
close the database

%java Server accounting
open database for accounting
log activities
close the database

%java Server sales
open database for sales
log activities
close the database

Your Ad Here




footer for State Pattern page