有一个应用,要求能够很好地接受u盘或者移动硬盘(假如两种介质的读写算法不一样)的接入,你如果是开发人员,应该怎么样开发这个应用?
•注意:程序里面只有两个功能:ReadInfo(),WriteInfo()
•方案1:在应用里面将所有可能的介质算法都开发一遍。但此方法不好,每次都要修改代码
•方案2:用spring管理
如下:
===================================================
定义U盘类
package usbdisk;
import app.IDISK;
public class UsbDisk implements IDISK{
public String readInfo(){
return "从U盘读过来的信息";
}
public void writeInfo(String msg){
System.out.println("向U盘写出信息:" + msg);
}
}
=====================================================
定义移动盘类:
package movedisk;
import app.IDISK;
public class MoveDisk implements IDISK{
public String readInfo(){
return "从移动硬盘读过来的信息";
}
public void writeInfo(String msg){
System.out.println("向移动硬盘写出信息:" + msg);
}
}
=====================================================
定义一个接口管理U盘和移动盘
package app;
public interface IDISK {
public abstract String readInfo();
public abstract void writeInfo(String msg);
}
========================================================
编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 对象的生成,由框架通过反射机制完成,控制权从前端主程序转化到了框架,
这种思想叫做控制反转(IOC),Inverse Of Control,可以很好的实现模块切换-->
<bean id="disk" class="usbdisk.UsbDisk"></bean>
</beans>
====================================================
测试
package app;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class MainModule {
public static void main(String[] args) {
//读取配置文件
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
IDISK disk =(IDISK)context.getBean("disk");//根据配置文件的内容,实例化对象并且返回
disk.writeInfo("你们好");
}
}
可以看到此disk是指usbdisk.UsbDisk,指的是U盘,如果要改为移动盘呢,只要在配制文件中改<bean id="disk" class="usbdisk.UsbDisk"></bean> class的值就可以了。
调用方(应用)和模块(u盘或者移动硬盘)之间用配置文件联系起来
当u盘或者移动硬盘接入时,改变配置文件,调用方始终在读配置文件,并没有改变源代码.
配置文件改变,可以进行模块切换,甚至改变模块行为
测试代码仅仅面向接口编程,而无需知道实现类的具体名称。同时,我们可以很简单的通过修改配置文件来切换具体的底层实现类。
•Spring作用1:这种思想可以很好地实现同类不同质的模块切换:例如要用不同的方法将内容写入到不同的介质
组件依赖关系减少,上面的例子中,我们通过Spring,在运行期动态将字符串注入到实现类的属性中。这种概念将参数传递交给容器去做,叫做依赖注入.
•Spring作用2:可以方便地通过配置文件改变模块行为,动态注入属性值