Ioc的两种实现方式
Ioc(Inversion of Control)中文翻译为“控制反转”,Ioc的抽象概念是依赖关系转移,即“程序与实现必须依赖于抽象”。
控制反转最常见的实现方式就是依赖注入(Depedency Injection),依赖注入的含义是:保留抽象接口,让组件依赖抽象接口,当组件要与其他对象发生依赖关系时,通过抽象接口来注入依赖的实际对象。
在解说Ioc之前,先看一个设计的例子:
设计一个保存数据到软盘、USB设备的程序。
设计一个保存数据到软盘、USB设备的程序。
一、Ioc
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:13:32
* 反面教材
* 具体组件
*/
publicclass FloppyWriter {
publicvoid saveToDevice() {
System.out.println("调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:14:25
* 反面教材
* 业务逻辑
*/
publicclass BusinessObject {
private FloppyWriter floppyWriter;
public FloppyWriter getFloppyWriter() {
returnfloppyWriter;
}
publicvoid setFloppyWriter(FloppyWriter floppyWriter) {
this.floppyWriter = floppyWriter;
}
publicvoid save() {
System.out.println("----开始调用业务组件BusinessObject的save()方法....");
floppyWriter.saveToDevice();
System.out.println("----结束调用业务组件BusinessObject的save()方法....");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 1:15:17
* 反面教材
* 客户端
*/
publicclass Client {
publicstaticvoid main(String args[]){
//构造并配置业务逻辑对象
BusinessObject businessObject=new BusinessObject();
FloppyWriter floppyWriter=new FloppyWriter();
businessObject.setFloppyWriter(floppyWriter);
//调用业务逻辑方法
businessObject.save();
}
}
二、Iocsetter
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:38:32
* 抽象组件接口
*/
publicinterface IDeviceWriter {
publicvoid saveToDevice();
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:44:46
* 组件,存储到软盘设备
*/
publicclass FloppyWriter implements IDeviceWriter{
publicvoid saveToDevice() {
System.out.println("调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:44:57
* 组件,存储到USB设备
*/
publicclass USBWriter implements IDeviceWriter{
publicvoid saveToDevice() {
System.out.println("调用USBWriter.saveToDevice()方法: 保存到了USB设备上!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:40:24
* 可重用的业务逻辑
*/
publicclass BusinessObject {
private IDeviceWriter writer;
public IDeviceWriter getWriter() {
returnwriter;
}
publicvoid setWriter(IDeviceWriter writer) {
this.writer = writer;
}
/**
* 通用的保存业务方法
*/
publicvoid save(){
System.out.println("----开始调用业务组件BusinessObject的save()方法....");
writer.saveToDevice();
System.out.println("----结束调用业务组件BusinessObject的save()方法....");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:51:09
* 客户端调用
*/
publicclass Client {
publicstaticvoid main(String args[]){
//构造两个组件对象
IDeviceWriter floppyWriter=new FloppyWriter();
IDeviceWriter usbWriter=new USBWriter();
//构造两个业务对象
BusinessObject businessObject1=new BusinessObject();
BusinessObject businessObject2=new BusinessObject();
//构造业务对象并执行通用的保存方法
businessObject1.setWriter(floppyWriter);
businessObject1.save();
System.out.println();
//构造业务对象并执行通用的保存方法
businessObject2.setWriter(usbWriter);
businessObject2.save();
}
}
三、Iocconstructor
setterIDeviceWriterFloppyWriterUSBWriterBusinessObject和
Client类修改为:
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:32:03
* 可重用的业务逻辑
*/
publicclass BusinessObject {
private IDeviceWriter writer;
public BusinessObject() {
}
public BusinessObject(IDeviceWriter writer) {
this.writer = writer;
}
public IDeviceWriter getWriter() {
returnwriter;
}
publicvoid setWriter(IDeviceWriter writer) {
this.writer = writer;
}
/**
* 通用的保存业务方法
*/
publicvoid save() {
System.out.println("----开始调用业务组件BusinessObject的save()方法....");
writer.saveToDevice();
System.out.println("----结束调用业务组件BusinessObject的save()方法....");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-25
* Time: 11:35:52
* 客户端调用
*/
publicclass Client {
publicstaticvoid main(String args[]){
//构造两个组件对象
IDeviceWriter floppyWriter=new FloppyWriter();
IDeviceWriter usbWriter=new USBWriter();
//构造两个业务对象
BusinessObject businessObject1=new BusinessObject(floppyWriter);
BusinessObject businessObject2=new BusinessObject(usbWriter);
//执行业务逻辑对象的保存方法
businessObject1.save();
System.out.println();
businessObject2.save();
}
}
两种实现方式执行的结果相同:
----开始调用业务组件BusinessObject的save()方法....
调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!
----结束调用业务组件BusinessObject的save()方法....
调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!
----结束调用业务组件BusinessObject的save()方法....
----开始调用业务组件BusinessObject的save()方法....
调用USBWriter.saveToDevice()方法: 保存到了USB设备上!
----结束调用业务组件BusinessObject的save()方法....
调用USBWriter.saveToDevice()方法: 保存到了USB设备上!
----结束调用业务组件BusinessObject的save()方法....
Process finished with exit code 0
Ioc与依赖注入实践

1437

被折叠的 条评论
为什么被折叠?



