依賴倒轉原則簡述
1.高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象
2.抽象不該該依賴細節,細節應該依賴抽象
3.依賴倒轉得中心思想時面向接口編程
4.依賴倒轉原則時基於這樣得設計理念:相對於細節得多變性,抽象得東西要穩定得多。以抽象爲基礎搭建的架構比以細節爲基礎搭建的架構要穩定得多。在java中,抽象指的時接口或是抽象類,細節就是具體得實現類
5.使用接口或抽象類的目的時規定好規範,而不涉及任何具體操做,把展示細節的任務交給他們的實現類完成
依賴倒轉原則的三種實現方式
1.接口傳遞
2.構造方法傳遞
3.setter方式傳遞
應用實例
沒有使用依賴倒轉原則
public class DependecyInversion {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
}
/*
* 完成Person接收消息的功能
*方式1分析
*1. 簡單,比較容易想到
*2. 若是咱們獲取的對象是微信,短信等等,則新增類,同時Person類也要增長相應的接受方法
*3.解決思路:引入一個抽象的接口IReceiver,表示接收者,這樣Person類 與接口IReceiver發生依賴
*由於Email,微信,等等屬於接收的範圍,他們各自實現IReceiver接口就ok了,這樣咱們就符合依賴倒轉原則
*/
class Email{
public String getInfo() {
return "電子郵件信息:hello, world";
}
}
class Person{
public void receive(Email email) {
System.out.println(email.getInfo());
}
}
複製代碼
接口傳遞
public class DependecyInversionTest {
public static void main(String[] args) {
//方法1,經過接口實現
ChangHong changHong = new ChangHong(); //建立ChangHong類的對象
OpenAndClose openAndClose = new OpenAndClose(); //建立OpenAndClose類的對象
openAndClose.open(changHong); //經過接口實現
}
}
//方式1:經過接口傳遞依賴
interface IOpenAndClose {
public void open(ITV tv);
}
interface ITV {
public void play();
}
class OpenAndClose implements IOpenAndClose{
public void open(ITV tv) {
tv.play();
}
}
class ChangHong implements ITV{
public void play() {
System.out.println("打開");
}
}
複製代碼
構造方法傳遞
public class DependecyInversionTest {
public static void main(String[] args) {
//方法2,經過構造器實現
ChangHong changHong = new ChangHong(); //建立ChangHong類的對象
OpenAndClose openAndClose= new OpenAndClose(changHong); //建立OpenAndClose類的對象
openAndClose.open(); //經過構造器實現
}
}
//方式2,經過構造方法依賴傳遞
interface IOpenAndClose {
public void open();
}
interface ITV{
public void play();
}
class OpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
}
class ChangHong implements ITV{
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("打開");
}
}
複製代碼
setter方式傳遞
public class DependecyInversionTest {
public static void main(String[] args) {
//方法3,經過setter方式實現
ChangHong changHong = new ChangHong(); //建立ChangHong類的對象
OpenAndClose openAndClose = new OpenAndClose(); //建立ChangHong類的對象
openAndClose.setTV(changHong); //經過setter方式傳遞
openAndClose.open(); //調用open()方法
}
}
//方式3,經過setter方法傳遞
interface IOpenAndClose{
public void open();
}
interface ITV{
public void play();
}
class ChangHong implements ITV{
public ITV tv;
public void play() {
System.out.println("打開");
}
}
class OpenAndClose implements IOpenAndClose{
public ITV tv;
public void setTV(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
}複製代碼