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

    一、定义

    1.依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

    二、依赖倒转设计和规范

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

    三、案例

    1.我第一次去海边钓鱼,所有我要带鱼竿,但是第二次去不仅想钓鱼还想抓螃蟹,又要带一个渔网,第三次去还要抓八爪章鱼,这时就要带叉子了,不然你会缠住哦!

    发现随着下海技术的提升,想要更多的海产品,就要更多的工具,依赖就越来越多了。

    这时可以抽象一个工具出来,因为你要抓的海产品都可以解释为工具,就算你后面要坐船去抓鲸鱼,也只要加一个方法就好了,可以一直在后面加。

    /**
     * @author 作者 ki16:
     * @version 创建时间:2021年7月21日 下午5:48:05
     *
     */
    
    public class RelyOn {
        
        public static void main(String[] args) {
            Person p = new Person();
            p.implement(new FishingRod());
            p.implement(new Fork());
        }
    
    }
    
    class Person{
        public void implement(Tool t){
            t.useTool();
        }
    }
    
    
    interface Tool{
        default void useTool(){};
    }
    
    class FishingRod implements Tool{
        public void useTool(){
            System.out.println("使用鱼竿:开始钓鲨鱼了!");
        }
    }
    
    class Fork implements Tool{
        public void useTool(){
            System.out.println("使用叉子:开始叉八爪章鱼了!");
        }
    }

     四、依赖关系传递的三种方式:核心就是传递

    ①、接口传递

    /**
     * @author 作者 ki16:
     * @version 创建时间:2021年7月21日 下午5:48:05
     *
     */
    
    public class RelyOn1 {
        
        public static void main(String[] args) {
            FishingRod fish = new FishingRod();
            Person person = new Person();
            person.implement(fish);//人使用鱼竿工具去钓鱼
            person.implement(new Fork());
        }
    }
    
    interface Tool{
        public void implement(useTool use);
    }
    
    class Person implements Tool{
        @Override
        public void implement(useTool use) {
            use.use();
        }
    }
    
    interface useTool{
        public void use();
    }
    
    class FishingRod implements useTool{
        @Override
        public void use() {
            System.out.println("使用鱼竿!");
        }
    }
    
    class Fork implements useTool{
    
        @Override
        public void use() {
            System.out.println("使用叉子!");
        }
        
    }

    ②、构造方法传递

    /**
     * @author 作者 ki16:
     * @version 创建时间:2021年7月21日 下午5:48:05
     *
     */
    
    public class RelyOn2 {
        
        public static void main(String[] args) {
            Tool tool = new Person(new FishingRod());//人拿着鱼竿
            tool.implement();//人拿着鱼竿去钓鱼
        }
    }
    
    interface Tool{
        public void implement();
    }
    
    class Person implements Tool{
        
        private UseTool useTool;
    
        public Person(UseTool useTool) {
            this.useTool = useTool;
        }
    
        @Override
        public void implement() {
            this.useTool.use();
        }
    }
    
    //使用工具
    interface UseTool{
        public void use();
    }
    
    
    
    class FishingRod implements UseTool{
        @Override
        public void use() {
            System.out.println("使用鱼竿!");
        }
    }

     ③、setter 方法传递

    import javax.jws.soap.SOAPBinding.Use;
    
    
    /**
     * @author 作者 ki16:
     * @version 创建时间:2021年7月21日 下午5:48:05
     *
     */
    
    public class RelyOn2 {
        
        public static void main(String[] args) {
            FishingRod fishingRod = new FishingRod();
            Tool tool = new Person();
            tool.setUseToll(fishingRod);
            tool.useTool();
            
        }
    
    }
    
    interface UseTool{
        public void use();
    }
    
    class FishingRod implements UseTool{
        @Override
        public void use() {
            System.out.println("使用鱼竿钓鱼!");
        }
    }
    
    interface Tool{
        public void useTool();
        public void setUseToll(UseTool useTool);
    }
    
    class Person implements Tool{
        private UseTool useTool;
        @Override
        public void useTool() {
            this.useTool.use();
        }
        @Override
        public void setUseToll(UseTool useTool) {
            this.useTool = useTool;
        }
    }
  • 相关阅读:
    20155239 2017-2018-1《信息安全系统设计》第二周课堂测试
    第一次课下测试试题补做
    20155239吕宇轩 《信息安全系统设计基础》第一周学习总结
    C语言指针学习
    C语言 迭代部分的代码编写
    20155234 2016-2017-2第十周《Java学习笔记》学习总结
    20155234 实验二 Java面向对象程序设计
    20155234 2610-2017-2第九周《Java学习笔记》学习总结
    20155234 2016-2017-2 《Java程序设计》第8周学习总结
    20155234 2016-2017-2 《Java程序设计》第7周学习总结
  • 原文地址:https://www.cnblogs.com/ki16/p/15040602.html
Copyright © 2011-2022 走看看