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

2023-03-29 15:39:08 浏览数 (1)

文章目录

  • 一、依赖倒置原则简介
  • 二、面向实现编程代码示例 ( 反面示例 )
    • 1、顾客类
    • 2、测试类
  • 三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类
  • 四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类
  • 五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类

一、依赖倒置原则简介


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

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

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

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

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

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

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


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复制
购买冰箱
购买电视

0 人点赞