在C和C++中程序员经常使用一些全局函数和函数指针代表一系列的命令或者操作,然后通过一个表格进行分派,例如:
- #include <stdio.h>
- void func1() {printf("func1\n");}
- void func2() {printf("func2\n");}
- typedef void (*fp)(void);
- fp funcs[] = {&func1, &func2, 0};
- int main()
- {
- int i = 0;
- while (funcs[i])
- funcs[i++]();
- return 0;
- }
但是Java的实现方式很不同。它没有指针也没有全局函数。Java创建和引用对象实例并通过对象调用相应的方法。具体如何实现呢?
- interface Action {
- public void doit();
- }
- class func1 implements Action {
- public void doit() {System.out.println("func1");}
- }
- class func2 implements Action {
- public void doit() {System.out.println("func2");}
- }
- public class call {
- private static Action alist[] = {
- new func1(),
- new func2()
- };
- public static void main(String args[])
- {
- for (int i = 0; i < alist.length; i++)
- alist[i].doit();
- }
- }
在这个例子中定义了一个接口Action,任何实现该接口的类都要定义并实现doit方法(这也是接口的基本意图)。然后可以用接口名指向那些类的对象实例。
在C++中Action应该是一个基类,带有func1和func2方法,对象操作可以通过基类的指针执行。在Java中一个 Action的引用支持相似的操作,即使Action不是func1和func2的超类。
Java中称这个为方法封装器,并且和C/C++的方式很不相同。当然这其中也有一些权衡和折中,在一些给定的条件下这种方式会工作得更好。
第二个例子
方法封装器的另一个例子在AWT中使用得相当的多。
- import java.awt.*;
- import java.awt.event.*;
- public class buttonlistener implements ActionListener {
- public void actionPerformed(ActionEvent e)
- {
- System.exit(0);
- }
- public static void main(String args[])
- {
- Frame f = new Frame("testing");
- Button b = new Button("OK");
- b.addActionListener(new buttonlistener());
- f.add(b);
- f.pack();
- f.setVisible(true);
- }
- }
这个例子创建一个框架并有一个 OK按钮,当按钮被按下程序就终止。按钮被加入了一个动作监听器,动作监听器保证实现actionPerformed方法,因为buttonlistener实现ActionListener实现接口。点击按钮的结果是导致调用按钮的动作监听器。
共2页 1 2






