//: state:StateDemo.java // Simple demonstration of the State pattern. package state; import junit.framework.*; interface State { void operation1(); void operation2(); void operation3(); } class ServiceProvider { private State state; public ServiceProvider(State state) { this.state = state; } public void changeState(State newState) { state = newState; } // Pass method calls to the implementation: public void service1() { // ... state.operation1(); // ... state.operation3(); } public void service2() { // ... state.operation1(); // ... state.operation2(); } public void service3() { // ... state.operation3(); // ... state.operation2(); } } class Implementation1 implements State { public void operation1() { System.out.println("Implementation1.operation1()"); } public void operation2() { System.out.println("Implementation1.operation2()"); } public void operation3() { System.out.println("Implementation1.operation3()"); } } class Implementation2 implements State { public void operation1() { System.out.println("Implementation2.operation1()"); } public void operation2() { System.out.println("Implementation2.operation2()"); } public void operation3() { System.out.println("Implementation2.operation3()"); } } public class StateDemo extends TestCase { static void run(ServiceProvider sp) { sp.service1(); sp.service2(); sp.service3(); } ServiceProvider sp = new ServiceProvider(new Implementation1()); public void test() { run(sp); sp.changeState(new Implementation2()); run(sp); } public static void main(String args[]) { junit.textui.TestRunner.run(StateDemo.class); } } ///:~