3 依赖倒置原则

依赖倒置原则

一、基本介绍

依赖倒置原则是指:

1)高层模块不应该依赖底层模块,二者都应该依赖其抽象

2)抽象不应该依赖细节,细节应该依赖抽象

3)中心思想是面向接口编程

4)依赖倒置原则是基于这样的设计理念:

相对于细节的多变性,抽象的东西要稳定。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。

5)使用接口或抽象类的目的是指定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

二、应用实例

完成Person接收消息的功能

1)方案1+分析说明

public class DependecyInversion1 {
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
    }
}

class Email {
    public String getInfo() {
        return "电子邮件信息:hello";
    }
}
class Person {
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}

分析:

  • 缺点:若获取的对象是微信、短信等等,则需新增类同时Person同时新增方法
  • 解决思路:引入抽象接口IReceiver表示接收者,Person类与接口IReceiver依赖。具体的接收范围Email、WeiXin等接收范围实现IReceiver接口。

2)方案2(依赖倒置)+分析

/**
 * 依赖倒置
 */
public class DependecyInversion1 {
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
        person.receive(new WeiXin());
    }
}

// 定义接口
interface IReceiver {
    public String getInfo();
}

class Email implements IReceiver {
    @Override
    public String getInfo() {
        return "电子邮件信息:hello";
    }
}

class WeiXin implements IReceiver {
    @Override
    public String getInfo() {
        return "微信信息:hello";
    }

}

class Person {
    public void receive(IReceiver receiver) {
        System.out.println(receiver.getInfo());
    }
}

三、依赖关系传递的三种方式

1)接口传递

2)构造方法传递

3)set方法传递

/**
 * 依赖关系传递
 */
public class DependencyPass {
    public static void main(String[] args) {
        // 1.接口传递
        ChangHong changHong = new ChangHong();
        OpenAndClose1 openAndClose1 = new OpenAndClose1();
        openAndClose1.open(changHong);

        // 2.构造方法传递
        OpenAndClose2 openAndClose2 = new OpenAndClose2(changHong);
        openAndClose2.open();

        // 3.set方法传递
        OpenAndClose3 openAndClose3 = new OpenAndClose3();
        openAndClose3.setTv(changHong);
        openAndClose3.open();
    }
}

// 方式1:通过接口传递实现依赖
// 开关接口
interface IOpenAndClose1 {
    public void open(ITV tv);
}

// TV接口
interface ITV {
    public void play();
}

class ChangHong implements ITV {
    @Override
    public void play() {
        System.out.println("长虹电视机,打开");
    }
}

class OpenAndClose1 implements IOpenAndClose1 {
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}

// 方式2:构造方法依赖传递
interface IOpenAndClose2 {
    public void open(); // 抽象方法
}

class OpenAndClose2 implements IOpenAndClose2 {
    public ITV tv; // 成员

    public OpenAndClose2(ITV tv) { // 构造器
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

// 方式3: set方法传递
interface IOpenAndClose3 {
    public void open();
    public void setTv(ITV tv);
}

class OpenAndClose3 implements IOpenAndClose3 {
    private ITV tv;

    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }

    @Override
    public void open() {
        this.tv.play();
    }
}

四、依赖倒置原则注意事项

1)低层模块尽量都有抽象类或接口,或者两者都有,程序稳定性更好。

2)变量的声明类型尽量是抽象类或接口,这样变量引用和实际对象间存在一个缓冲层,有利于程序扩展和优化。

3)继承时遵循里氏替换原则

你可能感兴趣的:(3 依赖倒置原则)