六大设计原则之DIP

目录

1.简介

2.定义

3.依赖

3.1 构造函数传递依赖对象

3.2 Setter方法传递依赖对象

3.3 接口声明依赖对象

4.举例


1.简介

依赖倒置原则(Dependence Inversion Principle),简称DIP。

2.定义

高层模块不应该依赖于低层模块,两者都应该依赖其抽象。抽象不应该依赖细节。细节应该依赖抽象。这里的低层模块就是不可分割的原子逻辑,原子逻辑再组装就成了高级模块。抽象是指接口或者抽象类,两者都是不能直接被实例化;细节就是实现类,实现接口或继承抽象类而产生的类,可以直接被直接实例化。所谓的能否直接实例化也就在于是否可以通过关键字new产生的一个对象。简单来说就是模块之间的依赖都是通过抽象发生,实现类之间并不直接产生依赖关系,其依赖关系都是通过接口或者抽象类产生的。实现类依赖接口或抽象类,但接口或抽象类不依赖实现类。这也正好对应面向接口编程。

3.依赖

传说中的实现方式有三种,且听我一一道来。假设存在两个接口IFace1和IFce2,IFace1的实现类依赖IFace2。

3.1 构造函数传递依赖对象

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    private IFace2 face2;

    public face1(IFace2 face2) {
        this.face2 = face2;
    }

    public void method1() {
        this.face2.method2();
    }
}

3.2 Setter方法传递依赖对象

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    private IFace2 face2;

    public void setFace2(IFace2 face2) {
        this.face2 = face2;
    }

    public void method1() {
        this.face2.method2();
    }
}

3.3 接口声明依赖对象

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    public void method1(IFace2 face2) {
        face2.method2();
    }
}

4.举例

想必大家都看过水浒传吧,其中有一人身上刺满一身青龙,刀枪剑戟十八班武艺样样精通,江湖人称九龙纹龙史进是也。

public interface IWupo {
    public void martialArts(IWeapon weapon);
}

public interface IWeapon {
    public void attack();
}

public class Wupo implements IWupo {
    public void martialArts(IWeapon weapon) {
        weapon.attack();
    }
}

public class Sword implements IWeapon {
    public void attack() {
        System.out.println("看我独孤九剑");
    }
}

public class Stick implements IWeapon {
    public void attack() {
        System.out.println("打狗棍法,看棍");
    }
}

public class Shuifu {
    public static void main(String[] args) {
        IWupo shiJin = new Wupo();
        IWeapon sword = new Sword();
        shiJin.martialArts(sword);
    }
}

这样,如果史进不想用剑了,改用其他兵器,我们可以只对高层模块进行修改

public class Shuifu {
    public static void main(String[] args) {
        IWupo shiJin = new Wupo();
        IWeapon stick = new Stick();
        shiJin.martialArts(stick);
    }
}

这便是DIP的核心,面向接口编程。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值