依赖倒转原则

依赖倒转原则(Dependence Inversion Principle)是指:

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转(倒置)的中心思想是面向接口编程
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中,抽象指的是接口或抽象类,细节就是具体的实现类
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

完成一个Person接收消息的功能。

public class Email {

    public  String getInfo(){
         return ("电子邮件Hello Word!");
    }
}

/**
 * 如果我们获取的对象不只有Email邮件,还有微信,QQ等,我们就要在增加一个类,Person在增加一个方法。
 * 解决思路:引入一个接口IRecever,表示接收者,Person与接口IReciver产生依赖,WinXin,Email,QQ实现IRecever.
 */
public class Person {

    public  void reciver(Email email){
        System.out.println(email.getInfo());
    }
}

public class DepDependen {
    public static void main(String[] args) {
        Person p = new Person();
        p.reciver(new Email());
    }
}

实现方案(依赖倒转)

public interface IReceiver {
    String getInfo();
}

public class Person {

    public  void reciver(IReceiver iReceiver){
        System.out.println(iReceiver.getInfo());
    }
}

public class Email implements IReceiver{

    public  String getInfo(){
         return ("电子邮件Hello Word!");
    }
}

public class WinXin implements IReceiver {

    @Override
    public String getInfo() {
        return "微信信息Hello Word!";
    }
}

public class DepDependen {
    public static void main(String[] args) {
        Person p = new Person();
        p.reciver(new Email());
        p.reciver(new WinXin());
    }
}



    1.  

依赖关系传递的三种方式和应用案例

接口传递

应用案例代码

public interface ITV {
    void play();
}


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


public interface IOpenAndClose {
    void open(ITV iTv);
}


class OpenAndClose implements IOpenAndClose{
    public void open(ITV iTv){
        iTv.play();
    }
}

public class Test {
    public static void main(String[] args) {
        ITV changHong = new ChangHong();
        IOpenAndClose openAndClose = new OpenAndClose();
        openAndClose.open(changHong);
    }

}

 

构造方法传递

应用案例代码

public interface IOpenAndClose {

    void open();
}


class OpenAndClose implements IOpenAndClose {
    public ITV iTv;
    public OpenAndClose(ITV iTv){
        this.iTv = iTv;
    }
    public void open(){
        iTv.play();
    }
}

public interface ITV {
    void play();
}


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

public class Test {
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose(changHong);
        openAndClose.open();
    }
}

 

setter 方式传递

public interface IOpenAndClose {

    void open();
}


class OpenAndClose implements IOpenAndClose {
    public ITV iTv;

    public void setiTv(ITV iTv) {
        this.iTv = iTv;
    }

    public void open(){
        iTv.play();
    }
}

public interface ITV {
    void play();
}


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

public class Test {
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.setiTv(changHong);
        openAndClose.open();
    }
}

依赖倒转原则的注意事项和细节

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好.
  2. 变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
  3. 继承时遵循里氏替换原则

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值