S-3-依赖倒转(倒置)原则

一、定义

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;
    }
}

 

posted @ 2021-07-21 17:40  ki1616  阅读(67)  评论(0编辑  收藏  举报