在象C這樣的程序設計語言中,函數指針常被用來消除龐大的switch語句。(參見 "Java Tip 30: Polymorphism and Java" 獲得更具體的介紹)Java沒有函數指針,所以我們可以用Command模式來實現回調函數。在下面的第一個代碼示例TestCommand.java中,你將實際看到它是如何實現的。
因此我建議,可以使用Command模式并結合Java的動態加載和綁定機制來實現函數指針。(關于Java的動態加載和綁定機制的具體介紹,參見Gosling和Henry McGilton的"The Java Language Environment -- A White Paper",列于"相關資源"。)
TestCommand.java class Fan { public void startRotate() { System.out. } public void stopRotate() { System.out.println("Fan is not rotating"); } } class Light { public void turnOn( ) { System.out.println("Light is on "); } public void turnOff( ) { System.out.println("Light is off"); } } class Switch { private Command UpCommand, DownCommand; public Switch( Command Up, Command Down) { UpCommand = Up; // concrete Command registers itself with the invoker DownCommand = Down; } void flipUp( ) { // invoker calls back concrete Command, which executes the Command on the receiver UpCommand . execute ( ) ;
} void flipDown( ) { DownCommand . execute ( ); } } class LightOnCommand implements Command { private Light myLight; public LightOnCommand ( Light L) { myLight = L; } public void execute( ) { myLight . turnOn( ); } } class LightOffCommand implements Command { private Light myLight; public LightOffCommand ( Light L) { myLight = L; } public void execute( ) { myLight . turnOff( ); } } class FanOnCommand implements Command { private Fan myFan; public FanOnCommand ( Fan F) { myFan = F; } public void execute( ) { myFan . startRotate( ); } } class FanOffCommand implements Command { private Fan myFan;
public FanOffCommand ( Fan F) { myFan = F; } public void execute( ) { myFan . stopRotate( ); } } public class TestCommand { public static void main(String[] args) { Light testLight = new Light( ); LightOnCommand testLOC = new LightOnCommand(testLight); LightOffCommand testLFC = new LightOffCommand(testLight); Switch testSwitch = new Switch(testLOC,testLFC); testSwitch.flipUp( ); testSwitch.flipDown( ); Fan testFan = new Fan( ); FanOnCommand foc = new FanOnCommand(testFan); FanOffCommand ffc = new FanOffCommand(testFan); Switch ts = new Switch( foc,ffc); ts.flipUp( ); ts.flipDown( ); } }
Command.java public interface Command { public abstract void execute ( ); }
相關資源 ? Design Patterns by Gamma, Helm, Johnson, Vlissides, Addison-Wesley, 1994, ISBN 0-201-63361-2 http://www.bookbuyer.com/cgi-bin/getTitle.cgi?ISBN=0201633612
? Dr. Dobb´s Journal, January 1998: "Java Reflection: Not just for tool developers," by Paul Tremblett http://www.ddj.com/articles/1998/9801/9801c/9801c.htm
? "The Java Language Environment -- A White Paper" (May 1996), by James Gosling and Henry McGilton covers details about Java´s dynamic loading and binding mechanism http://java.sun.com/docs/white/langenv/ For more on taking advantage of Java´s unique feature of dynamic loading and binding mechanism to build a dynamic and dynamically-extensible system, see http://java.sun.com/docs/white/langenv/