目录
1、高层模块不应该依赖低层模块,二者都应该依赖其抽象。
2、抽象不应该依赖细节,细节应该依赖抽象。
3、依赖倒转的中心思想是面向接口编程。
4、依赖倒转原则的设计理念:相对于细节的多变性,抽象的东西相对稳定。以抽象为基础搭建的架构比以细节搭建的架构要稳定的多。在Java中,抽象是指接口和抽象类,细节就是具体的实现类。
5、使用接口或抽象类的目的是制定好规范,不涉及具体的操作,把展现细节的操作交给它们的实现类去完成。
不使用依赖倒转原则代码示例:
- public class Depend {
- public static void main(String[] args) {
- Person person = new Person();
- person.receive(new Email());
- }
- }
- class Email{
- public String getInfo(){
- return "邮件信息:你好,tom";
- }
- }
-
- /**
- * 1、这样做简单,容易
- * 2、当获取的对象发生变化时,就要增加新的类,Person类也要增加新的方法。
- * 解决方法:引入一个抽象的接口IReceiver,表示接受者,Person类与IReceiver发生依赖
- * Email类等各自实现IReceiver即可。
- */
- class Person{
- public void receive(Email email){
- System.out.println(email.getInfo());
- }
- }
通过接口的方式实现依赖倒置示例代码:
- public class Depend {
- public static void main(String[] args) {
- Person person = new Person();
- person.receive(new Email());
- person.receive(new Note());
-
- }
- }
- //定义接口
- interface IReceiver{
- String getInfo();
- }
- class Email implements IReceiver{
- public String getInfo(){
- return "邮件信息:你好,tom";
- }
- }
- class Note implements IReceiver{
-
- @Override
- public String getInfo() {
- return "短信信息:你好,jack";
- }
- }
- class Person{
- public void receive(IReceiver iReceiver){
- System.out.println(iReceiver.getInfo());
- }
- }
通过构造方法的方式实现依赖倒置示例代码:
- public class Depend {
- public static void main(String[] args) {
- Person person = new Person(new Email());
- String info = person.getInfo();
- System.out.println(info);
- }
- }
- //定义接口
- interface IReceiver{
- String getInfo();
- }
- interface Content {
- String open();
- }
- class Person implements IReceiver{
- public Content content;
- public Person(Content content){
- this.content = content;
- }
-
- @Override
- public String getInfo() {
- return this.content.open();
- }
- }
- class Email implements Content{
-
- @Override
- public String open() {
- return "邮件信息:你好,tom";
- }
- }
通过setter方法的方式实现依赖倒置示例代码:
- public class Depend {
- public static void main(String[] args) {
- Email email = new Email();
- Person person = new Person();
- person.setContent(email);
- String info = person.getInfo();
- System.out.println(info);
- }
- }
- //定义接口
- interface IReceiver{
- String getInfo();
- void setContent(Content content);
- }
- interface Content {
- String open();
- }
- class Person implements IReceiver{
- public Content content;
- public void setContent(Content content){
- this.content = content;
- }
-
- @Override
- public String getInfo() {
- return this.content.open();
- }
-
- }
- class Email implements Content {
-
- @Override
- public String open() {
- return "邮件信息:你好,tom";
- }
- }
1、低层模块尽量都要有抽象类或接口,或者两者都有,程序的稳定性更好。
2、变量的声明类型尽量是抽象类或接口,这样做会使变量引用和实际对象间就会有一个缓冲层,有利于程序的扩展和优化。
3、继承时遵循里氏替换原则。