carfield.com.hk MouseAction.java 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">//: c04:mouse:MouseAction.java // This state machine takes an Iterator of Inputs // to move from State to State using a template // method. package c04.mouse; import c04.statemachine.*; public class MouseAction implements Input { private String action; public MouseAction(String a) { action = a; } public String toString() { return action; } public int hashCode() { return action.hashCode(); } public boolean equals(Object o) { return (o instanceof MouseAction) &amp;&amp; action.equals(((MouseAction)o).action); } public static MouseAction appears = new MouseAction(&quot;mouse appears&quot;), runsAway = new MouseAction(&quot;mouse runs away&quot;), enters = new MouseAction(&quot;mouse enters trap&quot;), escapes = new MouseAction(&quot;mouse escapes&quot;), trapped = new MouseAction(&quot;mouse trapped&quot;), removed = new MouseAction(&quot;mouse removed&quot;); } ///:~ </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z MouseAction.py 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="py" rows="16" cols="100">#: c04:mouse:MouseAction.py class MouseAction: def __init__(self, action): self.action = action def __str__(self): return self.action def __cmp__(self, other): return cmp(self.action, other.action) # Necessary when __cmp__ or __eq__ is defined # in order to make this class usable as a # dictionary key: def __hash__(self): return hash(self.action) # Static fields; an enumeration of instances: MouseAction.appears = MouseAction(&quot;mouse appears&quot;) MouseAction.runsAway = MouseAction(&quot;mouse runs away&quot;) MouseAction.enters = MouseAction(&quot;mouse enters trap&quot;) MouseAction.escapes = MouseAction(&quot;mouse escapes&quot;) MouseAction.trapped = MouseAction(&quot;mouse trapped&quot;) MouseAction.removed = MouseAction(&quot;mouse removed&quot;) #:~</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z MouseMoveList.java 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">//: c04:mouse:MouseMoveList.java // A transformer to produce a // List of MouseAction objects. package c04.mouse; import java.util.*; import com.bruceeckel.util.*; public class MouseMoveList extends ArrayList { public MouseMoveList(Iterator sit) { while(sit.hasNext()) add(new MouseAction((String)sit.next())); } } ///:~ </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z MouseMoves.txt 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/>mouse appears<br/>mouse runs away<br/>mouse appears<br/>mouse enters trap<br/>mouse escapes<br/>mouse appears<br/>mouse enters trap<br/>mouse trapped<br/>mouse removed<br/>mouse appears<br/>mouse runs away<br/>mouse appears<br/>mouse enters trap<br/>mouse trapped<br/>mouse removed<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z MouseTrap2Test.java 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">//: c04:mousetrap2:MouseTrap2Test.java // A better mousetrap using tables package c04.mousetrap2; import c04.mouse.*; import c04.statemachine.*; import java.util.*; import java.io.*; import com.bruceeckel.util.*; import com.bruceeckel.test.*; abstract class StateT implements State { protected Map transitions = null; protected void init(Object[][] states) { transitions = new HashMap(); for(int i = 0; i &lt; states.length; i++) transitions.put(states[i][0], states[i][1]); } public abstract void run(); public State next(Input i) { if(transitions.containsKey(i)) return (State)transitions.get(i); else throw new RuntimeException( &quot;Input not supported for current state&quot;); } } class MouseTrap extends StateMachine { public static State waiting = new Waiting(), luring = new Luring(), trapping = new Trapping(), holding = new Holding(); public MouseTrap() { super(waiting); // Initial state } } class Waiting extends StateT { public void run() { System.out.println( &quot;Waiting: Broadcasting cheese smell&quot;); } public State next(Input i) { // Delayed initialization: if(transitions == null) init(new Object[][] { { MouseAction.appears, MouseTrap.luring }, }); return super.next(i); } } class Luring extends StateT { public void run() { System.out.println( &quot;Luring: Presenting Cheese, door open&quot;); } public State next(Input i) { if(transitions == null) init(new Object[][] { { MouseAction.enters, MouseTrap.trapping }, { MouseAction.runsAway, MouseTrap.waiting }, }); return super.next(i); } } class Trapping extends StateT { public void run() { System.out.println(&quot;Trapping: Closing door&quot;); } public State next(Input i) { if(transitions == null) init(new Object[][] { { MouseAction.escapes, MouseTrap.waiting }, { MouseAction.trapped, MouseTrap.holding }, }); return super.next(i); } } class Holding extends StateT { public void run() { System.out.println(&quot;Holding: Mouse caught&quot;); } public State next(Input i) { if(transitions == null) init(new Object[][] { { MouseAction.removed, MouseTrap.waiting }, }); return super.next(i); } } public class MouseTrap2Test extends UnitTest { MouseTrap trap = new MouseTrap(); MouseMoveList moves = new MouseMoveList( new StringList(&quot;../mouse/MouseMoves.txt&quot;) .iterator()); public void test() { trap.runAll(moves.iterator()); } public static void main(String args[]) { new MouseTrap2Test().test(); } } ///:~ </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z MouseTrapTest.java 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">//: c04:mousetrap1:MouseTrapTest.java // State Machine pattern using 'if' statements // to determine the next state. package c04.mousetrap1; import c04.mouse.*; import c04.statemachine.*; import com.bruceeckel.util.*; import java.util.*; import java.io.*; import com.bruceeckel.test.*; // A different subclass for each state: class Waiting implements State { public void run() { System.out.println( &quot;Waiting: Broadcasting cheese smell&quot;); } public State next(Input i) { MouseAction ma = (MouseAction)i; if(ma.equals(MouseAction.appears)) return MouseTrap.luring; return MouseTrap.waiting; } } class Luring implements State { public void run() { System.out.println( &quot;Luring: Presenting Cheese, door open&quot;); } public State next(Input i) { MouseAction ma = (MouseAction)i; if(ma.equals(MouseAction.runsAway)) return MouseTrap.waiting; if(ma.equals(MouseAction.enters)) return MouseTrap.trapping; return MouseTrap.luring; } } class Trapping implements State { public void run() { System.out.println(&quot;Trapping: Closing door&quot;); } public State next(Input i) { MouseAction ma = (MouseAction)i; if(ma.equals(MouseAction.escapes)) return MouseTrap.waiting; if(ma.equals(MouseAction.trapped)) return MouseTrap.holding; return MouseTrap.trapping; } } class Holding implements State { public void run() { System.out.println(&quot;Holding: Mouse caught&quot;); } public State next(Input i) { MouseAction ma = (MouseAction)i; if(ma.equals(MouseAction.removed)) return MouseTrap.waiting; return MouseTrap.holding; } } class MouseTrap extends StateMachine { public static State waiting = new Waiting(), luring = new Luring(), trapping = new Trapping(), holding = new Holding(); public MouseTrap() { super(waiting); // Initial state } } public class MouseTrapTest extends UnitTest { MouseTrap trap = new MouseTrap(); MouseMoveList moves = new MouseMoveList( new StringList(&quot;../mouse/MouseMoves.txt&quot;) .iterator()); public void test() { trap.runAll(moves.iterator()); } public static void main(String args[]) { new MouseTrapTest().test(); } } ///:~ </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z makefile 2001-12-26T16:00:00Z 2001-12-26T16:00:00Z <br/><TEXTAREA name="code" class="" rows="16" cols="100"># From Thinking in Patterns (with Java) by Bruce Eckel # At http://www.BruceEckel.com # (c)2001 Bruce Eckel # Copyright notice in Copyright.txt # Automatically-generated MAKEFILE # For examples in directory .\c04\mousetrap2 # using the JDK 1.3 compiler # Invoke with: make HOME := ../../ ifndef MAKECMDGOALS MAKECMDGOALS := javac endif # Command.com is too weak to build this under Windows NT/2000: ifeq ($(OS),Windows_NT) COMSPEC=$(SYSTEMROOT)\system32\cmd.exe endif ifneq ($(MAKECMDGOALS),clean) include $(HOME)/$(MAKECMDGOALS).mac endif .SUFFIXES : .class .java .java.class : $(JVC) $(JVCFLAGS) $&lt; javac: \ MouseTrap2Test.class jikes: \ MouseTrap2Test.class clean: ifeq ($(notdir $(SHELL)),COMMAND.COM) del *.class else rm -f *.class endif MouseTrap2Test.class: MouseTrap2Test.java $(JVC) $(JVCFLAGS) $&lt; java com.bruceeckel.test.RunUnitTests c04.mousetrap2.MouseTrap2Test </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2001-12-26T16:00:00Z