public class NoteBook { /* * 运行功能 */ public void run(){ System.out.println("notebook run"); } /* * 使用usb设备 */ public void useUSB(USB usb){ if(usb!=null){ usb.open(); usb.close(); } } }
public interface USB { /* * 定义开启 */ void close(); /* * 定义开启 */ void open(); }
public class KeyByUSB implements USB { @Override public void close() { System.out.println("key close"); } @Override public void open() { System.out.println("key open"); }}
public class MouseByUSB implements USB { @Override public void close() { System.out.println("mouse close"); } @Override public void open() { System.out.println("mouse open"); }}
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class NoteBookMain { public static void main(String[] args) throws IOException, Exception { NoteBook book = new NoteBook(); book.run(); book.useUSB(null); //因为有了鼠标,所以需要在源程序中创建鼠标对象并传递给笔记本。 //希望后期出现了设备后,可不可以不用修改NoteBook的代码,还可以不断加入新设备。// book.useUSB(new MouseByUSB());通过反射来解决问题 //对外提供配置文件 File configFile = new File("usb.properties"); if(!configFile.exists()){ configFile.createNewFile(); } //读取流和配置文件相关联 FileInputStream fis = new FileInputStream(configFile); Properties prop = new Properties(); prop.load(fis); for(int x = 1; x <= prop.size();x++){ String className = prop.getProperty("usb"+x); //对指定的类进行加载 Class clazz = Class.forName(className); USB usb = (USB)(clazz.newInstance()); book.useUSB(usb); } fis.close(); }}
usb.properties配置文件的内容如下:
usb1=cn.qujianlei.reflect.notebooktest.MouseByUSB
usb2=cn.qujianlei.reflect.notebooktest.KeyByUSB后期新增设备就不需要修改源代码,而用修改配置文件的方式来完成,增加了程序的扩展性。