image.png···
    1.错误示范

    1. package com.kris.designmode.principle.dependenceinversion;
    2. public class DependenceInversion {
    3. public static void main(String[] args) {
    4. Person person = new Person();
    5. person.receive(new Email());
    6. }
    7. }
    8. /**
    9. * 实现一个Person类,接受消息
    10. * 方式1分析
    11. * 1.简单,比较容易想到
    12. * 2.如果获取的对象是微信,短信等,需要增加类,同时Person需要增加相应的接收方法
    13. * 3.解决,引入一个抽象的接口IMessage,表示接收的内容,这样Person类与IMessage接口发生依赖
    14. * 因为Email,WeiXin 等,属于接收的范围,各自实现IMessage
    15. */
    16. class Person{
    17. public void receive(Email email){
    18. System.out.println(email.getInfo());
    19. }
    20. }
    21. class Email{
    22. public String getInfo(){
    23. return "email info : hello world";
    24. }
    25. }

    2.正确示范

    1. package com.kris.designmode.principle.dependenceinversion.improve;
    2. public class DependenceInversion2 {
    3. public static void main(String[] args) {
    4. //客户端无需改变
    5. Person person = new Person();
    6. person.receive(new Email());
    7. person.receive(new Wechat());
    8. }
    9. }
    10. /**
    11. * Person与IMessage接口发生依赖
    12. */
    13. class Person{
    14. public void receive(IMessage email){
    15. System.out.println(email.getInfo());
    16. }
    17. }
    18. interface IMessage{
    19. String getInfo();
    20. }
    21. class Email implements IMessage{
    22. public String getInfo(){
    23. return "email info : hello world";
    24. }
    25. }
    26. class Wechat implements IMessage{
    27. public String getInfo(){
    28. return "wechat info : hello world";
    29. }
    30. }

    3.依赖倒转传递的方式

    3.1setter方法注入依赖

    1. package com.kris.designmode.principle.dependenceinversion.improve;
    2. public class DependenceInversion3{
    3. public static void main(String[] args) {
    4. //客户端无需改变
    5. Person2 person = new Person2();
    6. person.setMessage(new Email2());
    7. person.receive();
    8. person.setMessage(new Wechat2());
    9. person.receive();
    10. }
    11. }
    12. /**
    13. * Person与IMessage接口发生依赖,setter方法注入依赖
    14. */
    15. class Person2{
    16. private IMessage2 message;
    17. public void setMessage(IMessage2 message){
    18. this.message=message;
    19. }
    20. public void receive(){
    21. System.out.println(message.getInfo());
    22. }
    23. }
    24. interface IMessage2{
    25. String getInfo();
    26. }
    27. class Email2 implements IMessage2{
    28. public String getInfo(){
    29. return "email info : hello world";
    30. }
    31. }
    32. class Wechat2 implements IMessage2{
    33. public String getInfo(){
    34. return "wechat info : hello world";
    35. }
    36. }

    3.2构造方法注入依赖

    1. package com.kris.designmode.principle.dependenceinversion.improve;
    2. public class DependenceInversion4{
    3. public static void main(String[] args) {
    4. Person4 person = new Person4(new Email4());
    5. person.receive();
    6. }
    7. }
    8. /**
    9. * Person与IMessage接口发生依赖,setter方法注入依赖
    10. */
    11. class Person4{
    12. public IMessage4 message;
    13. public Person4(IMessage4 message){
    14. this.message=message;
    15. }
    16. public void receive(){
    17. System.out.println(message.getInfo());
    18. }
    19. }
    20. interface IMessage4{
    21. String getInfo();
    22. }
    23. class Email4 implements IMessage4{
    24. public String getInfo(){
    25. return "email info : hello world";
    26. }
    27. }

    4.注意事项

    image.png