携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
需求
- 我们日常都是通过邮件来进行重大事情确认的,今天我们就来实现一个邮件的功能吧。
无设计
public class DependencyInversion {
public static void main(String[] args) {
Person person = new Person();
person.recevice(new Email());
}
}
class Email {
public String getInfo() {
return "电邮";
}
}
class Person{
public void recevice(Email email) {
System.out.println(email.getInfo());
}
}
-
依赖倒转原则即: Dependence Inversion Principle
- 不应该依赖底层模块,或者说我们更加追求的极致需要我们优化他。二者都应该依赖其抽象;我们可以依赖抽象类也可以依赖接口,但是不要依赖具体的子类或者实现类
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转的中心思想是面向接口编程
-
上述代码很容易就实现了。也很容易读懂。但是当我们需求增加后就会发现我们的代码改动比较大。
-
后续只要我们增加一种消息类型,就对应的需要增加一个消息实体进行处理,Person类也需要增加相应的方法依赖具体的消息实体来完成消息的接收。
设计
- 仔细想想对于Person来说根本不需要针对每个消息实体进行处理。因为消息实体对于Person来说就是一个载体。Person只需要一个能够发送消息的载体即可,不管你是邮件,微信还是其他通讯工具。而这些工具都有一个特征就是通讯。所以我们需要将其进行抽象。
public class DependencyInversion {
public static void main(String[] args) {
Person person = new Person();
person.recevice(new Email());
}
}
interface IReceiver{
public String getInfo();
}
class Email implements IReceiver{
@Override
public String getInfo() {
return "电邮";
}
}
class Person{
public void recevice(IReceiver receiver) {
System.out.println(receiver.getInfo());
}
}
总结
- 在协作开发时尽量将我们依赖的对象进行抽象化。这里的抽象可以时抽象类也可以时接口。这样方便我们传递子类或者是实现类来进行功能的扩展。
- 在使用变量时也应该尽量来使用抽象类或者时接口。这样我们实际的对象就是一个动态的变量。也方便我们后期对他进行功能的扩展。
- 另外继承时需要注意遵循里氏替换原则。至于啥事里氏替换原则了?关注我不走丢。咱们下期见