美文网首页
3 依赖倒置原则

3 依赖倒置原则

作者: 思无邪_1c6a | 来源:发表于2019-07-30 23:05 被阅读0次

    依赖倒置原则

    一、基本介绍

    依赖倒置原则是指:

    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 依赖倒置原则

          本文链接:https://www.haomeiwen.com/subject/wwqarctx.html