标签:构造 void 微信消息 理念 out main open 传递 直接
     面向接口编程,依赖于抽象而不是依赖与具体类,写具体类时通过接口进行交互
1. 基本介绍
    (1)高层模块不应该依赖低层模块,二者都应该依赖抽象
            (2)抽象不应该依赖细节,细节应该依赖抽象
            (3)依赖倒置的中心思想是面向接口编程
            (4)依赖倒置原则的设计理念,相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的框架比以细节为基础的框架稳定,java中,抽象代表接口或抽象类,细节代表具体的实现类
            (5)使用接口的目的是制定好规范,不涉及具体的操作,把具体的细节交给实现类完成
2. 应用场景
完成Person 接收消息
/**
 * 完成Person 接收信息
 * 1、如果需要接收别的信息时,需要新增类,同时Person 需要添加新的方法
 * 2、解决思路: 定义一个接收的接口,person 类去实现,
 * 3、如果需要接收别的信息,新增类可直接实现接收接口,实现接收信息
 */
static class Email {
    public String getInfo() {
        return "接收邮件信息";
    }
}
static class Person {
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}
public static void main(String[] args) {
    Person person = new Person();
    person.receive(new Email());
    //改进
    PersonInfo personInfo = new PersonInfo();
    personInfo.receive(new WeChat());
}
/**
 * 改进方案 接收邮件、微信消息
 */
interface IReceive {
    public String getInfo();
}
static class WeChat implements IReceive {
    @Override
    public String getInfo() {
        return "接收微信消息";
    }
}
static class PersonInfo {
    //person 修改为对接口的依赖
    public void receive(IReceive receive) {
        System.out.println(receive.getInfo());
    }
}`
3. 依赖传递的三种方式
公共的接口
   interface ITv {
        public void play();
    }
    static class ChangHong implements ITv {
        @Override
        public void play() {
            System.out.println("打开电视机-----");
        }
    }
(1)通过接口传递
interface IOpen {
        public void open(ITv tv);
}
static class Open implements IOpen {
        @Override
        public void open(ITv tv) {
                tv.play();
        }
}
public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        Open open = new Open();
        open.open(changHong);
}`
(2)通过构造函数传递
   interface IOpenAndClose {
        public void open();
    }
    static class OpenAndClose implements IOpenAndClose {
        private ITv tv;
        //构造函数
        public OpenAndClose(ITv tv) {
            this.tv = tv;
        }
        @Override
        public void open() {
            tv.play();
        }
    }
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose(changHong);
        openAndClose.open();
    }
(3)通过setter方法传递
 interface IOpenClose {
        public void open();
        //set
        public void setOpen(ITv tv);
    }
    static class OpenClose implements IOpenClose {
        private ITv tv;
        @Override
        public void open() {
            this.tv.play();
        }
        @Override
        public void setOpen(ITv tv) {
            this.tv = tv;
        }
    }
    public static void main(String[] args) {
        ChangHong changHong = new ChangHong();
        OpenClose openClose = new OpenClose();
        openClose.setOpen(changHong);
        openClose.open();
    }
标签:构造 void 微信消息 理念 out main open 传递 直接
原文地址:https://blog.51cto.com/14804892/2491906