注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

Ioc的推荐实现方式


2007-09-24 23:52:48
 标签:Ioc   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/43900
Ioc的两种实现方式
 
Ioc(Inversion of Control)中文翻译为“控制反转”,Ioc的抽象概念是依赖关系转移,即“程序与实现必须依赖于抽象”。
 
控制反转最常见的实现方式就是依赖注入(Depedency Injection),依赖注入的含义是:保留抽象接口,让组件依赖抽象接口,当组件要与其他对象发生依赖关系时,通过抽象接口来注入依赖的实际对象。
 
在解说Ioc之前,先看一个设计的例子:
设计一个保存数据到软盘、USB设备的程序。
 
 
一、反面例子,没有使用Ioc
 
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:13:32
 * 反面教材
 * 具体组件
 */
public class FloppyWriter {
    public void saveToDevice() {
        System.out.println("调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!");
    }
}
 
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:14:25
 * 反面教材
 * 业务逻辑
 */
public class BusinessObject {
    private FloppyWriter floppyWriter;
 
    public FloppyWriter getFloppyWriter() {
        return floppyWriter;
    }
 
    public void setFloppyWriter(FloppyWriter floppyWriter) {
        this.floppyWriter = floppyWriter;
    }
 
    public void save() {
        System.out.println("----开始调用业务组件BusinessObjectsave()方法....");
        floppyWriter.saveToDevice();
        System.out.println("----结束调用业务组件BusinessObjectsave()方法....");
    }
}
 
 
 
 
 
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 1:15:17
 * 反面教材
 * 客户端
 */
public class Client {
    public static void main(String args[]){
        //构造并配置业务逻辑对象
        BusinessObject businessObject=new BusinessObject();
        FloppyWriter floppyWriter=new FloppyWriter();
        businessObject.setFloppyWriter(floppyWriter);
 
        //调用业务逻辑方法
        businessObject.save();
    }
}
 
 
 
 
 
 
 
 
二、Ioc的实现推荐实现方式:setter方式
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:38:32
 * 抽象组件接口
 */
public interface IDeviceWriter {
    public void saveToDevice();
}
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:44:46
 * 组件,存储到软盘设备
 */
public class FloppyWriter implements IDeviceWriter{
    public void saveToDevice() {
        System.out.println("调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!");
    }
}
 
 
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:44:57
 * 组件,存储到USB设备
 */
public class USBWriter implements IDeviceWriter{
    public void saveToDevice() {
        System.out.println("调用USBWriter.saveToDevice()方法: 保存到了USB设备上!");
    }
}
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:40:24
 * 可重用的业务逻辑
 */
public class BusinessObject {
    private IDeviceWriter writer;
 
    public IDeviceWriter getWriter() {
        return writer;
    }
 
    public void setWriter(IDeviceWriter writer) {
        this.writer = writer;
    }
 
    /**
     * 通用的保存业务方法
     */
    public void save(){
        System.out.println("----开始调用业务组件BusinessObjectsave()方法....");
        writer.saveToDevice();
        System.out.println("----结束调用业务组件BusinessObjectsave()方法....");
    }
}
 
 
 
 
 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:51:09
 * 客户端调用
 */
public class Client {
    public static void main(String args[]){
        //构造两个组件对象
        IDeviceWriter floppyWriter=new FloppyWriter();
        IDeviceWriter usbWriter=new USBWriter();
 
        //构造两个业务对象
        BusinessObject businessObject1=new BusinessObject();
        BusinessObject businessObject2=