zoukankan      html  css  js  c++  java
  • 依赖倒转原则 (面向接口编程)

    基本概念:

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

    2、抽象不应该依赖细节(具体实现),细节(具体实现)应该依赖抽象

    3、依赖倒转(倒置)的中心思想是面向接口编程

    4、依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。

    以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类

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

    依赖倒转要做的事:

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

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

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

    举例:Person类接收到来自Emil的信息:"电子邮件信息: hello,world"

    方式一、传统方式

    public class DependecyInversion {
     
    	public static void main(String[] args) {
    		Person person = new Person();
    		person.receive(new Email());
    	}
     
    }
     
     
    class Email {
    	public String getInfo() {
    		return "电子邮件信息: hello,world";
    	}
    }
     
     
    class Person {
    	public void receive(Email email ) {
    		System.out.println(email.getInfo());
    	}
    }
    

    分析

    存在的缺陷:
         如果我们获取的对象是 微信,短信等等,则需要新增类,同时Perons也要增加相应的接收方法
    
    解决思路:
    
          引入一个抽象的接口IReceiver, 表示接收者, 这样Person类与接口IReceiver发生依赖(依赖抽象,摆脱了Email细节类)因为Email, WeiXin 等等属于接收的范围,他们各自实现IReceiver 接口就行, 这样我们就符合依赖倒转原则。
    
    这种原则很常见 因为你会发现很多公司都采用这种思想。比如 网易云Api,支付宝Api等各种接口非常常见

    方式二、通过接口传递依赖关系

    public class DependecyInversion {
     
    	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 {
    	public String getInfo() {
    		return "电子邮件信息: hello,world";
    	}
    }
     
    //增加微信
    class WeiXin implements IReceiver {
    	public String getInfo() {
    		return "微信信息: hello,ok";
    	}
    }
     
    //方式2
    class Person {
    	//这里我们是对接口的依赖
    	public void receive(IReceiver receiver ) {
    		System.out.println(receiver.getInfo());
    	}
    }
    

     方式三、通过构造方法传递依赖关系 

    public class DependencyPass {
     
        public static void main(String[] args) {
            ChangHong changHong = new ChangHong();
    //        通过构造器进行依赖传递
    		OpenAndClose openAndClose = new OpenAndClose(changHong);
    		openAndClose.open();
        }
     
    }
    class ChangHong implements ITV {
        public void play() {
            // TODO Auto-generated method stub
            System.out.println("长虹电视机,打开");
        }
    }
     
    interface ITV { //ITV接口
    	public void play();
    }
     
    interface IOpenAndClose {
    	public void open(); //抽象方法
    }
     
    // 方式3: 通过构造方法依赖传递
    class OpenAndClose implements IOpenAndClose {
    	public ITV tv; //成员
     
    	public OpenAndClose(ITV tv) { //构造器
    		this.tv = tv;
    	}
     
    	public void open() {
    		this.tv.play();
    	}
    }
    

    方式四、通过Setter方法传递依赖关系 

    public class DependencyPass {
     
        public static void main(String[] args) {
            ChangHong changHong = new ChangHong();
            OpenAndClose openAndClose = new OpenAndClose();
            openAndClose.setTv(changHong);
            openAndClose.open();
     
        }
     
    }
    class ChangHong implements ITV {
        @Override
        public void play() {
            System.out.println("长虹电视机,打开");
        }
     
    }
     
    interface IOpenAndClose {
        public void open(); // 抽象方法
     
        public void setTv(ITV tv);
    }
     
    interface ITV { // ITV接口
        public void play();
    }
     
    // 方式4 , 通过setter方法传递
    class OpenAndClose implements IOpenAndClose {
        private ITV tv;
     
        public void setTv(ITV tv) {
            this.tv = tv;
        }
     
        public void open() {
            this.tv.play();
        }
    }
    

    原文链接:https://blog.csdn.net/qq_41813208/article/details/103077719  

  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/ljstudy/p/14500189.html
Copyright © 2011-2022 走看看