高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置)的中心思想是面向接口编程 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好 变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
使用前
需求:老师通过不同的APP与学生聊天
实现老师通过微信、扣扣的方式,完成与学生互动需求;
package com.javaxl.design.rules.relyOn.before;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-16 11:51
*/
public class Teacher {
public void receiveWeiXin(WeiXin weiXin){
System.out.println(weiXin.getInfo());
}
public void receiveQQ(QQ qq){
System.out.println(qq.getInfo());
}
}
class WeiXin{
public String info;
public String getInfo() {
return info;
}
public WeiXin(String info) {
this.info = info;
}
}
class QQ{
public String info;
public String getInfo() {
return info;
}
public QQ(String info) {
this.info = info;
}
}
public class Client {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.receiveQQ(new QQ("qq发送的消息"));
teacher.receiveWeiXin(new WeiXin("微信发送的消息"));
}
}
需求变更:老师新增了一个渠道“钉钉”获取学生的信息
package com.javaxl.design.rules.relyOn.beforePlus;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-16 11:51
*/
public class Teacher {
public void receiveWeiXin(WeiXin weiXin){
System.out.println(weiXin.getInfo());
}
public void receiveQQ(QQ qq){
System.out.println(qq.getInfo());
}
public void receiveDing(DingDing dingDing){
System.out.println(dingDing.getInfo());
}
}
class WeiXin{
private String info;
public String getInfo() {
return info;
}
public WeiXin(String info) {
this.info = info;
}
}
class QQ{
private String info;
public String getInfo() {
return info;
}
public QQ(String info) {
this.info = info;
}
}
class DingDing{
private String info;
public String getInfo() {
return info;
}
public DingDing(String info) {
this.info = info;
}
}
public class Client {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.receiveQQ(new QQ("qq发送的消息"));
teacher.receiveWeiXin(new WeiXin("微信发送的消息"));
teacher.receiveDing(new DingDing("钉钉发送的消息"));
}
}
使用后
实现老师通过微信、扣扣的方式,完成与学生互动需求;
package com.javaxl.design.rules.relyOn.after;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-16 12:01
*/
public class Teacher {
public void receive(App app){
System.out.println(app.getInfo());
}
}
interface App{
String getInfo();
}
class WinXin implements App{
private String info;
public WinXin(String info) {
this.info = info;
}
@Override
public String getInfo() {
return info;
}
}
class QQ implements App{
private String info;
public QQ(String info) {
this.info = info;
}
@Override
public String getInfo() {
return info;
}
}
public class Client {
public static void main(String[] args) {
Teacher teacher =new Teacher();
teacher.receive(new WinXin("微信发来的消息"));
teacher.receive(new QQ("qq发来的消息"));
}
}
需求变更:老师新增了一个渠道“钉钉”获取学生的信息
package com.javaxl.design.rules.relyOn.afterPlus;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-16 12:01
*/
public class Teacher {
public void receive(App app){
System.out.println(app.getInfo());
}
}
interface App{
String getInfo();
}
class WinXin implements App {
private String info;
public WinXin(String info) {
this.info = info;
}
@Override
public String getInfo() {
return info;
}
}
class QQ implements App {
private String info;
public QQ(String info) {
this.info = info;
}
@Override
public String getInfo() {
return info;
}
}
class DingDing implements App {
private String info;
public DingDing(String info) {
this.info = info;
}
@Override
public String getInfo() {
return info;
}
}
public class Client {
public static void main(String[] args) {
Teacher teacher =new Teacher();
teacher.receive(new WinXin("微信发来的消息"));
teacher.receive(new QQ("qq发来的消息"));
teacher.receive(new DingDing("钉钉发来的消息"));
}
}
从上面可以看出
使用依赖倒转原则前:调用方-高层模块(Teacher类)依赖低层模块(WinXin类、QQ类),这样造成的后果就是,当低层模块扩展,需要高层模块做出一定的调整;这就违反了ocp原则;
使用依赖倒转原则后:调用方-高层模块(Teacher类)依赖低层模块对应的抽象(App接口),此时低层模块发生扩展,高层模块不受影响,这符合ocp原则;
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有