background image

  }
  

// public java.util.List act(java.util.List params)

 
  

public

 java.util.List act(String content, String content2,

  java.util.List params)
  {
  List result = 

new

 ArrayList();

  result.add(content);
  result.add(content2);
  result.add(params);
  

return

 result;

  }
  }
 
  我们还可以写其他很多类,但是有个问题,接口是无法实例化的,我们必须手动控
制具体实例化哪个类,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实
例化一个类,执行它的 act 方法,那我们的工作就轻松多了。
  很幸运,我使用的是 Java,只有 Java 才提供这样的反射机制,或者说内省机制,可
以实现我们的无理要求。编写一个配置文件 emp.properties:
  #成功响应
  1000=Success
  #向客户发送普通文本消息
  2000=Load
  #客户向服务器发送普通文本消息
  3000=Store
  文件中的键名是客户将发给我的消息头,客户发送 1000 给我,那么我就执行
Success 类的 act 方法,类似的如果发送 2000 给我,那就执行 Load 类的 act 方法,这样一
来系统就完全符合开闭原则了,如果要添加新的功能,完全不需要修改已有代码,只需
要在配置文件中添加对应规则,然后编写新的类,实现 act 方法就 ok,即使我弃这个项
目而去,它将来也可以很好的扩展。这样的系统具备了非常良好的扩展性和可插入性。
  下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个类:
  import java.lang.reflect.*;
  import java.util.Properties;
  import java.io.FileInputStream;
  import java.util.List;
  

//这个程序是针对 Operator 编程的,所以无需做任何修改,直接提供 Load 和 Store 类,

就可以支持 2000、3000 做参数的调用

  

//有了这样的内省机制,可以把接口的作用发挥到极至,设计模式也更能体现出威力,

而不仅仅供我们饭后闲聊。

 
  

public

 

class

 TestReflect

  {
  

//加载配置文件,查询消息头对应的类名