【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )

举报
韩曙亮 发表于 2022/01/11 01:48:07 2022/01/11
【摘要】 文章目录 一、依赖倒置原则简介二、面向实现编程代码示例 ( 反面示例 )1、顾客类2、测试类 三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )1、顾客类2、...





一、依赖倒置原则简介



依赖倒置原则 : 高层模块 不应该 依赖 低层模块 , 二者都应该 依赖其抽象 ;
抽象 不应该 依赖细节 , 细节应该依赖抽象 ;

针对接口编程 , 不要针对实现编程 ;


通过抽象 , 包括使用 接口 或 抽象类 , 使个各类或模块之间 彼此独立 , 互不影响 , 从而实现模块之间的 松耦合 , 降低模块间的耦合性 ;

使用依赖倒置原则时的注意点 :

  • 每个类都 尽量 实现自接口继承抽象类 ;
  • 尽量 避免从具体的类派生 ;
  • 尽量 不要覆盖基类方法 ;

依赖倒置原则的优点 : 减少类之间的 耦合性 , 提高系统 稳定性 , 提高 代码可读性 , 可维护性 , 可 降低修改程序所造成的风险 ;





二、面向实现编程代码示例 ( 反面示例 )




1、顾客类


package dependenceinversion;

/**
 * 如果要增加一个新功能 , 就需要在该类中添加一个新方法
 *      这就是面向实现编程 , 该实现类需要经常进行修改
 *      扩展性很差
 *
 * 应用层的函数 , 是依赖于底层实现的 , 由于没有实现接口
 *      造成了应用层的测试类 , 直接依赖于本类
 *      应用层的模块属于高层模块
 *      本类属于低层模块
 *      根据依赖倒置原则 , 高层次的模块是不应该依赖于低层次的模块的
 */
public class Customer {
    public void buyFridge() {
        System.out.println("购买冰箱");
    }

    public void buyTelevision() {
        System.out.println("购买电视");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2、测试类


package dependenceinversion;

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.buyFridge();
        customer.buyTelevision();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行结果 :

购买冰箱
购买电视

  
 
  • 1
  • 2

在这里插入图片描述





三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )




1、顾客类


使用接口方法注入 IGood 实现类 ;

package dependenceinversion;

public class Customer {
    /**
     * 接口方法注入 IGood 实现类
     *      也可以使用构造函数 , 注入 IGood 实现类
     *
     * 此处就是面向接口编程
     *      如果添加了新的类 , 不需要修改本类
     *      只需要添加新的接口实现类即可
     *      面向接口编程 , 而不是面向本实现类
     *      对于高层模块来说 , 具体传入的参数是什么参数 ,
     *      交给高层模块选择
     *
     * 本类 与 具体的 IGood 接口 实现 是解耦的
     *      本类 与 应用层 客户端测试类 之间是解耦的
     *
     * 如果在添加一个新商品 , 直接定义一个新的接口实现类即可
     *
     * @param iGood
     */
    public void buy(IGood iGood) {
        iGood.buy();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2、商品接口


package dependenceinversion;

/**
 * 商品接口
 */
public interface IGood {
    /**
     * 购买商品
     */
    void buy();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3、冰箱商品


package dependenceinversion;

/**
 * 冰箱商品
 */
public class FridgeGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买冰箱");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4、电视商品


package dependenceinversion;

/**
 * 电视商品
 */
public class TelevisionGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买电视");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、测试类


package dependenceinversion;

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.buy(new FridgeGood());
        customer.buy(new TelevisionGood());
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行结果 :

购买冰箱
购买电视

  
 
  • 1
  • 2

在这里插入图片描述





四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )




1、顾客类


使用构造函数注入 IGood 实现类 ;

package dependenceinversion;

public class Customer {
    private IGood iGood;

    /**
     * 使用构造函数注入 IGood 实现类
     * @param iGood
     */
    public Customer(IGood iGood) {
        this.iGood = iGood;
    }

    public void buy() {
        this.iGood.buy();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2、商品接口


package dependenceinversion;

/**
 * 商品接口
 */
public interface IGood {
    /**
     * 购买商品
     */
    void buy();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3、冰箱商品


package dependenceinversion;

/**
 * 冰箱商品
 */
public class FridgeGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买冰箱");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4、电视商品


package dependenceinversion;

/**
 * 电视商品
 */
public class TelevisionGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买电视");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、测试类


package dependenceinversion;

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer(new FridgeGood());
        customer.buy();

        Customer customer2 = new Customer(new TelevisionGood());
        customer2.buy();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

执行结果 :

购买冰箱
购买电视

  
 
  • 1
  • 2

在这里插入图片描述





五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )




1、顾客类


使用 Setter 方法注入 IGood 实现类 ;

package dependenceinversion;

public class Customer {
    private IGood iGood;

    public void setiGood(IGood iGood) {
        this.iGood = iGood;
    }

    public void buy() {
        this.iGood.buy();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2、商品接口


package dependenceinversion;

/**
 * 商品接口
 */
public interface IGood {
    /**
     * 购买商品
     */
    void buy();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3、冰箱商品


package dependenceinversion;

/**
 * 冰箱商品
 */
public class FridgeGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买冰箱");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4、电视商品


package dependenceinversion;

/**
 * 电视商品
 */
public class TelevisionGood implements IGood {
    @Override
    public void buy() {
        System.out.println("购买电视");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、测试类


package dependenceinversion;

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer();

        customer.setiGood(new FridgeGood());
        customer.buy();

        customer.setiGood(new TelevisionGood());
        customer.buy();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行结果 :

购买冰箱
购买电视

  
 
  • 1
  • 2

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119877943

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。