【设计模式学习】(四)七大原则之依赖倒转原则

理论知识


概念

  1. 高层模块不应该依赖于低层模块, 二者都应该依赖于抽象
  2. 实现应该依赖于抽象, 即稳定应该依赖于变化
  3. 面向接口编程
  4. 使用接口的目的是设计规范而不涉及细节

优点

稳定性强,不会因为低层模块的变化而需改变大量的高层模块

代码实现


不遵循依赖倒转原则

代码
package com.study.dependencyReverse;

public class DependencyReverse1 {
    public static void main(String[] args) {
        new Person().receive(new IPhone());
    }
}

class IPhone {
    public String getPhoneName() {
        return "苹果手机";
    }
}


class Person {
    public void receive(IPhone i) {
        System.out.println("我用" + i.getPhoneName() + "接电话");
    }
}
分析

此时,看起来没啥问题,但是当我提出新的需求,新增小米手机和华为手机时,就需要改变Person类,重载receive方法(代码如下),破坏了框架稳定性。当系统很大时,逻辑就会出现混乱,维护较为困难

代码
package com.study.dependencyReverse;

public class DependencyReverse2 {
    public static void main(String[] args) {
        new Person1().receiveIphone(new IPhone1());
        new Person1().receiveMiPhone(new MiPhone());
        new Person1().receiveHWPhone(new HWPhone());
    }
}

class IPhone1 {
    public String getPhoneName() {
        return "苹果手机";
    }
}

class MiPhone {
    public String getPhoneName() {
        return "小米手机";
    }
}

class HWPhone {
    public String getPhoneName() {
        return "华为手机";
    }
}


class Person1 {
    public void receiveIphone(IPhone1 i) {
        System.out.println("我用" + i.getPhoneName() + "接电话");
    }

    public void receiveMiPhone(MiPhone m) {
        System.out.println("我用" + m.getPhoneName() + "接电话");
    }

    public void receiveHWPhone(HWPhone h) {
        System.out.println("我用" + h.getPhoneName() + "接电话");
    }
}

遵循依赖倒转原则

代码
package com.study.dependencyReverse;

public class DependencyReverse3 {
    public static void main(String[] args) {
        new Person2().receive(new IPhone2());
        new Person2().receive(new MiPhone1());
        new Person2().receive(new HWPhone1());
    }
}

interface IPhoneName{
    String getPhoneName();
}

class IPhone2 implements IPhoneName {

    @Override
    public String getPhoneName() {
        return "苹果手机";
    }
}

class MiPhone1 implements IPhoneName {
    @Override
    public String getPhoneName() {
        return "小米手机";
    }
}

class HWPhone1 implements IPhoneName {
    @Override
    public String getPhoneName() {
        return "华为手机";
    }
}

class Person2 {
    public void receive(IPhoneName i) {
        System.out.println("我用" + i.getPhoneName() + "接电话");
    }
}
分析

Person类依赖IPhoneName接口, 新增手机类型时只需要添加IPhoneName的实现类即可,不用修改高层模块,提高了稳定性和可维护性。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值