在不改动源程序的情况下,可以通过对外提供配置文件的形式。
/* * * 需求:笔记本电脑运行。 * 增加需求:想使用一个鼠标。 * 可以对鼠标进行描述。 * 并在笔记本中定一个使用鼠标的方法。 * public void useMouse(Mouse m){ m.open(); m.close(); } 虽然这样可以运行,但是日后如果在有其他设备比如摄像头等设备,还是修改笔记本类。 不利于扩展。 * 该程序在定义时并未考虑扩展性。 * * * 以后出现的功能会有很多。而且未知。 * 为了降低后期设备和笔记本的耦合性。 * 在前期应该先定义规则。笔记本使用这个规则,后期的设备只要符合这个规则笔记本就可以使用。 * * 定义规则: * 只要是符合usb规范的设备笔记本都可以用。 * 在描述笔记本。 * * * 后期,要使用鼠标。 * 该鼠标必须符合usb的规则。 * 描述鼠标实现USB接口,并将鼠标对象作为参数传递给笔记本即可。 * * 但是对于一个已经可以运行的应用程序,不建议在改动它的源码。 * * 为了进一步提高扩展性,对于未知子类可以通过反射技术来完成。 * 哪就必须在编写该应用程序时,加入反射机制。 * * * */ NoteBook book = new NoteBook(); book.run(); book.useUSB(null);// book.useUSB(new MouseByUSB()); /* * 后期设备不确定,可以作为参数传递, * 参数如何获取呢? * 在不改动源程序的情况下,可以通过对外提供配置文件的形式。 * */ //1,定义一个配置文件对象。 File configFile = new File("temp\\usb.properties"); if(!configFile.exists()){ configFile.createNewFile(); } //读取配置文件中的信息。 Properties prop = new Properties(); // BufferedReader bufr = new BufferedReader(new FileReader(configFile)); FileReader fr = new FileReader(configFile); prop.load(fr); 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); } fr.close();
package org.bean.reflact.tall;public class NoteBook { public void useUSB(USB usb) { if(usb!=null) { usb.close(); usb.start(); } }}
package org.bean.reflact.tall;public interface USB { public void start(); public void close();}
package org.bean.reflact.tall;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Properties;public class Test { public static void main(String[] args) { NoteBook book=new NoteBook(); File file=new File("temp\\usb.properties"); try { FileReader fread=new FileReader(file); Properties properties=new Properties(); try { properties.load(fread); for(int i=1;i<=properties.size();i++) { String value=properties.getProperty("usb"+i); try { Class clazz=Class.forName(value); //初始化对象实例 try { USB usb=(USB)clazz.newInstance(); book.useUSB(usb); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
//实体类
Mouse,KeyBoard,Camera
//配置文件
usb.properties
<
usb1=org.bean.reflact.tall.KeyBoardusb2=org.bean.reflact.tall.Mouseusb3=org.bean.reflact.tall.Camager
>
//输出结果
我是键盘关闭我是见哦按开启我是鼠标关闭我是鼠标开启