zoukankan      html  css  js  c++  java
  • 依赖倒置原则

    官方定义

    依赖倒转原则,又称依赖倒置原则(Dependence Inversion Principle),又称DIP原则

    上层模块不应该依赖底层模块,它们都应该依赖于抽象
    抽象不应该依赖于细节,细节应该依赖于抽象

    基本介绍

    • 抽象 接口或者抽象类
    • 细节 实现类

    换句话说,依赖倒转原则 核心的理念 相对于细节来说,抽象要稳定得多。就是要求我们要面向接口编程
    抽象类和接口 价值? 设计

    package DependenceInversionPrinciple;
    
    public class InversionDemo {
        public static void main(String[] args) {
            new Worker().getMessage(new DingDing());
            new Worker().getMessage(new WeChat());
            new Worker().getMessage(new Message());
        }
    }
    
    interface IMessage {
        void sendMessage();
    }
    
    class Worker {
        public void getMessage(IMessage iMessage) {
            iMessage.sendMessage();
        }
    }
    
    class DingDing implements IMessage {
        @Override
        public void sendMessage() {
            System.out.println("钉钉上,老板找你加班了");
        }
    }
    
    class WeChat implements IMessage {
    
        @Override
        public void sendMessage() {
            System.out.println("钉钉不回,老板给你打微信电话了");
        }
    }
    
    class Message implements IMessage {
    
        @Override
        public void sendMessage() {
    
        }
    }
    

    案例总结

    依赖倒转原则本质上,就是通过抽象(抽象类和接口)使得各个类或者模块实现彼此独立,互不影响,实现模块间松耦合,要先顶层再细节的方式来进行代码设计

    依赖关系的传递方式

    一、通过接口传递

    //假设消息规范
    interface IMessage2{
        void sendMessage(Produce produce);
    }
    
    //消息真正的生产者
    interface Produce{
        void produceMessage();
    }
    
    class Worker2 implements IMessage2 {
    
        @Override
        public void sendMessage(Produce produce) {
            produce.produceMessage();
        }
    }
    

    二、通过构造方法传递

    interface IMessage2{
        void sendMessage(Produce produce);
    }
    
    //消息真正的生产者
    interface Produce{
        void produceMessage();
    }
    
    class Worker2 implements IMessage2 {
        public Produce produce;
        public Worker2(Produce produce){
            this.produce = produce;
        }
    
        @Override
        public void sendMessage(Produce produce) {
            produce.produceMessage();
        }
    }
    

    三、通过set()方法传递

    interface IMessage2 {
        void sendMessage(Produce produce);
    }
    
    //消息真正的生产者
    interface Produce {
        void produceMessage();
    }
    
    class Worker2 implements IMessage2 {
        public Produce produce;
    
        public void setProduce(Produce produce) {
            this.produce = produce;
        }
    
        @Override
        public void sendMessage(Produce produce) {
            produce.produceMessage();
        }
    }
    

    注意事项&细节

    • 底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定更好
    • 变量的声明类型尽量是抽象类或者接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
    • 继承时遵循里氏替换原则。
    转载请注明出处:https://www.cnblogs.com/stu-jyj3621
  • 相关阅读:
    51nod 1081 子段求和
    51nod 1085 背包问题
    51nod 1012 最小公倍数LCM
    51nod 1046 A^B Mod C
    51nod 1057 N的阶乘
    死锁 必然
    two-sum
    一些基本定义
    常用命令
    python_99_面向对象多态
  • 原文地址:https://www.cnblogs.com/stu-jyj3621/p/14668621.html
Copyright © 2011-2022 走看看