依赖倒转----设计模式七大原则
今天又学习了依赖倒转原则,做下笔记,供自己复习和小伙伴们分享~
基本介绍
**依赖倒转原则(Dependence Inversion Principle)**是指:
- 高层模块不应该依赖底层模块,二者都应该依赖其抽象。
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转(倒置)的中心思想是面向接口编程。
- 依赖倒转原则是基于这样的设计理念;相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构稳定的多,在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
- 使用接口或抽象类的目的是制定好规范,而不涉及任何的具体操作,把展现细节的任务交给他们的实现类去完成。
下面直接给出案例分析!
原来含缺陷的程序代码(注释讲解)
package com.gaoliwei.dependency_inversion;
public class DependecyInversion {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email());
}
}
class Email{
public String getInfo(){
return "电子邮件信息:Hello, World!";
}
}
//完成Peroson接收消息的功能
//方式1分析
//1. 简单,比较容易想到和理解
//2. 如果我们获取的对象是微信,短信等等,则新增类,同时Person也要增加相应的接受方法
//3. 解决思路:引入一个抽象的接口IReceiver,表示接收者,这样Person类与接口IReceiver发生依赖
// 因为Email,WeiXin,QQ等社交软件都属于接收信息的范围,它们各自实现IReceiver接口就可以,这样就可以实现依赖倒转原则
class Person{
public void receive(Email email){
System.out.println(email.getInfo());
}
}
运行结果
电子邮件信息:Hello, World!
改进后的程序源码(注释讲解)
package com.gaoliwei.dependency_inversion;
interface IReceiver{
String getInfo();
}
//Email信息传递类
class Email01 implements IReceiver{
@Override
public String getInfo() {
return "电子邮件信息:Hello, World!";
}
}
//WeChat 信息传递类
class Wechat implements IReceiver{
@Override
public String getInfo() {
return "微信信息:Hello, World";
}
}
//QQ 信息传递类
class QQ implements IReceiver{
@Override
public String getInfo() {
return "qq信息:Hello, World";
}
}
//客户端无需改变,这种方式的好处是与接口发生依赖
//即receiver方法传递的实例是IReceiver接口的实例, 与接口发生依赖,只要接口无变化,
//IReceiver子类(细节)发生改变并无影响,稳定性较高
class Person01{
private IReceiver iReceiver;
public Person01(){}
//依赖关系传递的三种方式和应用案例
//构造方法传递
// public Person01(IReceiver iReceiver){
// this.iReceiver = iReceiver;
// }
//setter方式传递
// public void setiReceiver(IReceiver iReceiver) {
// this.iReceiver = iReceiver;
// }
//接口传递
public void receiver(IReceiver iReceiver){
System.out.println(iReceiver.getInfo());
}
}
//测试类
public class DependenceInversion02 {
public static void main(String[] args) {
Person01 person01 = new Person01();
person01.receiver(new Email01());
person01.receiver(new Wechat());
person01.receiver(new QQ());
}
}
运行结果
电子邮件信息:Hello, World!
微信信息:Hello, World
qq信息:Hello, World