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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式软件设计七大原则 ( 依赖倒置原则 | 代码示例 )相关的知识,希望对你有一定的参考价值。





一、依赖倒置原则简介



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

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


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

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

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

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





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




1、顾客类


package dependenceinversion;

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

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

2、测试类


package dependenceinversion;

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

执行结果 :

购买冰箱
购买电视





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




1、顾客类


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

package dependenceinversion;

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

2、商品接口


package dependenceinversion;

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

3、冰箱商品


package dependenceinversion;

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

4、电视商品


package dependenceinversion;

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

5、测试类


package dependenceinversion;

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

执行结果 :

购买冰箱
购买电视





四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 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();
    }
}

2、商品接口


package dependenceinversion;

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

3、冰箱商品


package dependenceinversion;

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

4、电视商品


package dependenceinversion;

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

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();
    }
}

执行结果 :

购买冰箱
购买电视





五、依赖倒置原则代码示例 ( 推荐示例 | 使用 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();
    }
}

2、商品接口


package dependenceinversion;

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

3、冰箱商品


package dependenceinversion;

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

4、电视商品


package dependenceinversion;

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

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();
    }
}

执行结果 :

购买冰箱
购买电视

以上是关于设计模式软件设计七大原则 ( 依赖倒置原则 | 代码示例 )的主要内容,如果未能解决你的问题,请参考以下文章

软件架构设计的七大原则

一句话总结软件设计七大原则

设计模式的七大原则 --里氏替换原则

-设计模式七大基本原则分析+实战+总结(详细)

软件设计原则都有哪些

设计模式 - 七大设计原则