前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )

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

作者头像
韩曙亮
发布2023-03-29 15:39:08
2580
发布2023-03-29 15:39:08
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、依赖倒置原则简介


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

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

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

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

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

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

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


1、顾客类

代码语言:javascript
复制
package dependenceinversion;

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

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

2、测试类

代码语言:javascript
复制
package dependenceinversion;

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

执行结果 :

代码语言:javascript
复制
购买冰箱
购买电视
在这里插入图片描述
在这里插入图片描述

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


1、顾客类

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

代码语言:javascript
复制
package dependenceinversion;

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

2、商品接口

代码语言:javascript
复制
package dependenceinversion;

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

3、冰箱商品

代码语言:javascript
复制
package dependenceinversion;

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

4、电视商品

代码语言:javascript
复制
package dependenceinversion;

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

5、测试类

代码语言:javascript
复制
package dependenceinversion;

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

执行结果 :

代码语言:javascript
复制
购买冰箱
购买电视
在这里插入图片描述
在这里插入图片描述

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


1、顾客类

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

代码语言:javascript
复制
package dependenceinversion;

public class Customer {
    private IGood iGood;

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

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

2、商品接口

代码语言:javascript
复制
package dependenceinversion;

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

3、冰箱商品

代码语言:javascript
复制
package dependenceinversion;

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

4、电视商品

代码语言:javascript
复制
package dependenceinversion;

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

5、测试类

代码语言:javascript
复制
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();
    }
}

执行结果 :

代码语言:javascript
复制
购买冰箱
购买电视
在这里插入图片描述
在这里插入图片描述

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


1、顾客类

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

代码语言:javascript
复制
package dependenceinversion;

public class Customer {
    private IGood iGood;

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

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

2、商品接口

代码语言:javascript
复制
package dependenceinversion;

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

3、冰箱商品

代码语言:javascript
复制
package dependenceinversion;

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

4、电视商品

代码语言:javascript
复制
package dependenceinversion;

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

5、测试类

代码语言:javascript
复制
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();
    }
}

执行结果 :

代码语言:javascript
复制
购买冰箱
购买电视
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、依赖倒置原则简介
  • 二、面向实现编程代码示例 ( 反面示例 )
    • 1、顾客类
      • 2、测试类
      • 三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
        • 1、顾客类
          • 2、商品接口
            • 3、冰箱商品
              • 4、电视商品
                • 5、测试类
                • 四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
                  • 1、顾客类
                    • 2、商品接口
                      • 3、冰箱商品
                        • 4、电视商品
                          • 5、测试类
                          • 五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
                            • 1、顾客类
                              • 2、商品接口
                                • 3、冰箱商品
                                  • 4、电视商品
                                    • 5、测试类
                                    相关产品与服务
                                    腾讯云服务器利旧
                                    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档