面向接口编程,依赖于抽象而不是依赖与具体类,写具体类时经过接口进行交互
1. 基本介绍java
(1)高层模块不该该依赖低层模块,两者都应该依赖抽象 (2)抽象不该该依赖细节,细节应该依赖抽象 (3)依赖倒置的中心思想是面向接口编程 (4)依赖倒置原则的设计理念,相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的框架比以细节为基础的框架稳定,java中,抽象表明接口或抽象类,细节表明具体的实现类 (5)使用接口的目的是制定好规范,不涉及具体的操做,把具体的细节交给实现类完成
2. 应用场景编程
完成Person 接收消息微信
/** * 完成Person 接收信息 * 一、若是须要接收别的信息时,须要新增类,同时Person 须要添加新的方法 * 二、解决思路: 定义一个接收的接口,person 类去实现, * 三、若是须要接收别的信息,新增类可直接实现接收接口,实现接收信息 */ 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)经过接口传递ide
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方法传递this
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(); }