建设银行网站公告,2022国内外重大新闻事件10条,天津城市网络建设,域名服务商是什么意思依赖倒转原则#xff08;Dependence Inversion Principle#xff09;
基本介绍
高层模块不应该依赖低层模块#xff0c;二者都应该依赖其抽象#xff08;接口/抽象类#xff09;抽象不应该依赖细节#xff0c;细节应该依赖抽象依赖倒转#xff08;倒置#xff09;的…
依赖倒转原则Dependence Inversion Principle
基本介绍
高层模块不应该依赖低层模块二者都应该依赖其抽象接口/抽象类抽象不应该依赖细节细节应该依赖抽象依赖倒转倒置的中心思想是面向接口编程依赖倒转原则是基于这样的设计理念相对于细节的多变性抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定的多。在Java中抽象指的是接口或抽象类细节就是具体的实现类使用接口或抽象类的目的是制定好规范而不涉及任何具体的操作把展现细节的任务交给他们的实现类去完成
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 11:26* File: DependecyInversion* Description: 依赖倒转原则*/
public class DependencyInversion {public static void main(String[] args) {Persion persion new Persion();persion.receive(new Email());}
}class Email {public String getInfo() {return email: hello!;}
}/*** 完成Persion接收消息的功能* 方式1:* 1. 简单容易实现* 2. 如果我们获取的对象是微信短信等则需新增类同时Persion类也需要添加相应的接收方法* 3. 解决思路引入一个抽象接口IReceive表示接收者这样Persion类与接口发生依赖关系。Email、微信、短信等各自实现IReceive接口符合依赖倒转原则*/
class Persion {public void receive(Email email) {System.out.println(email.getInfo());}
}
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 11:26* File: DependecyInversion* Description: 依赖倒转原则*/
public class DependencyInversion {public static void main(String[] args) {// 客户端无需改变Persion persion new Persion();persion.receive(new Email());persion.receive(new WeChat());}
}// 定义一个接口
interface IReceiver {public String getInfo();
}// Email
class Email implements IReceiver {public String getInfo() {return email: hello!;}
}// 微信
class WeChat implements IReceiver {public String getInfo() {return wechat: hello!;}
}/*** 方式2*/
class Persion {// 对接口的依赖public void receive(IReceiver receiver) {System.out.println(receiver.getInfo());}
}依赖关系传递的三种关系
接口传递构造方法传递setter方式传递
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 15:29* File: DependencyPass* Description:*/
public class DependencyPass {public static void main(String[] args) {ChangHong tv new ChangHong();// 方式1
// OpenAndClose openAndClose new OpenAndClose();
// openAndClose.open(tv);// 方式2
// OpenAndClose openAndClose new OpenAndClose(tv);
// openAndClose.open();// 方式3OpenAndClose openAndClose new OpenAndClose();openAndClose.setTv(tv);openAndClose.open();}
} 方式1通过接口传递实现依赖开关的接口
//interface IOpenAndClose {
// public void open(ITV tv);
//}
//ITV接口
//interface ITV {
// public void play();
//}
//
//class ChangHong implements ITV {
// public void play() {
// System.out.println(ChangHong is playing);
// }
//}
//实现接口
//class OpenAndClose implements IOpenAndClose {
// public void open(ITV tv) {
// tv.play();
// }
//} 方式2通过构造方法依赖传递
//interface IOpenAndClose {
// public void open();
//}
//
//interface ITV {
// public void play();
//}
//
//class ChangHong implements ITV {
// public void play() {
// System.out.println(ChangHong is playing);
// }
//}
//
//class OpenAndClose implements IOpenAndClose {
// private ITV tv;
//
// public OpenAndClose(ITV tv) {
// this.tv tv;
// }
//
// public void open() {
// tv.play();
// }
//}// 方式3通过setter方法传递
interface IOpenAndClose {public void open();public void setTv(ITV tv);
}interface ITV {public void play();
}class ChangHong implements ITV {public void play() {System.out.println(ChangHong is playing);}
}class OpenAndClose implements IOpenAndClose {private ITV tv;public void setTv(ITV tv) {this.tv tv;}public void open() {tv.play();}
}注意事项和细节
低层模块尽量都要有抽象类或接口或者两者都有程序稳定性更好变量的声明类型尽量是抽象类或接口这样我们的变量引用和实际对象间就存在一个缓冲层利于程序扩展和优化继承时遵循里氏替换原则
github笔记