设计模式七大原则之依赖倒转原则

设计模式七大原则之依赖倒转原则

一. 什么是依赖倒转原则

依赖倒转原则:面向接口编程

1.1 特点

  • 抽象不应该依赖细节,细节应该依赖抽象。
  • 使用抽象的目的是制定好规范,而不涉及具体的操作,把展现细节的任务交给他们的细节去完成。

注意:在Java中,抽象就是接口或者抽象类, 细节就是具体的实现类。所以简单来说依赖倒置就是提倡面向接口编程。

1.2 依赖关系传递的三种方式

  • 接口传递:在普通方法中使用接口或抽象类作为形参。
  • 构造方法传递: 通过构造方法对本类的抽象类或者接口进行赋值。
  • setter方式传递: 通过setter方法对本类的抽象类或者接口进行赋值。

1.3 依赖倒转原则注意事项和细节

  • 变量的声明类型尽量是抽象类或者接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化

二. 未遵循依赖倒转原则案例说明

2.1 类图设计

2.2 代码示例

package com.principle.dependency;

/**
 * @author inconspicuousy
 */
public class DependencyInverse {

    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email()); // 我是邮件信息
    }
}

class Email {
    // 邮件类提供获取邮件信息的方法
    public void getInfo() {
        System.out.println("我是邮件信息");
    }
}

class Person {
    // 用户可以接收邮件, 获取到邮件信息
    public void receive(Email email) {
        email.getInfo();
    }
}

2.3 潜在隐患

  • 当前Person类只能接收Email信息, 当想要扩展其他功能,比如接收短信息时就需要修改Person类,添加接收短信息的新方法。当前问题就是Person类依赖的太过细节,要修改成面向抽象来开发,这样就很好的扩展功能。

三. 完整案例

3.1 类图设计

3.2 代码示例

package com.principle.dependency;

/**
 * @author inconspicuousy
 */
public class DependencyInverse {

    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email()); // 我是邮件信息
        person.receive(new Message()); // 我是短消息
    }
}

// 定义可以发送消息的抽象接口
interface ISend {
    void getInfo();
}

class Email implements ISend{
    // 邮件类提供获取邮件信息的方法
    public void getInfo() {
        System.out.println("我是邮件信息");
    }
}

class Message implements ISend {
    @Override
    public void getInfo() {
        System.out.println("我是短消息");
    }
}

class Person {
    // 用户可以接收任意可以发送消息的类
    public void receive(ISend iSend) {
        iSend.getInfo();
    }
}

这里在设计Person类时, 使其依赖接口,每当想要接收其他数据时,只需要创建可以发送消息的类去实现ISend接口就可以作为实参传入给Person类的receive函数,使其获取到消息实体。

转载自:https://blog.csdn.net/qq844579582/article/details/109027569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值