總結接口的知識點
(菜鳥一只,有侵權或者不足之處請指出,謝謝)
Java接口
接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
語法:
使用關鍵字interface關鍵字來定義。
注意:定義的接口文件仍然是.java文件。雖然聲明的時候使用interface關鍵字,編譯之后仍然是.class
接口可以理解為一種特殊的類(可以看成100%的抽象類),里面全部是由常量和公共的抽象方法所組成,接口是解決Java無法使用多繼承的一種手段,但是接口在實際中更多的作用是制定行為標准的。
(1)我們不能直接去實例化一個接口,因為接口中的方法都是抽象的,是沒有方法體的。
但是,我們可以使用接口類型的引用指向一個實現了該接口的對象,並且可以調用這個接口中的方法。(實際上就是使用了Java中多態的特性),比如:
IStraegy con = new BackDoor();(語法: 接口名 接口類指引名 = new 實現了接口對象() )
con.operate();//通過接口類指引名調用方法
(個人覺得這是非常實用的)
(2)一個類可以實現不止一個接口。
(3)接口也可以繼承,並且可以多繼承,所以接口可以用來彌補類無法實現多繼承的局限。
(4)一個類如果要實現某個接口的話,那么它必須要實現這個接口中的所有方法。
(5)接口中所有的方法都是抽象方法,所有的屬性都是public static final的。接口類的中的抽象方法和接口的成員變量訪問權限都是public,寫和不寫都是這個權限,實現類中的方法的權限也必須是public。否則報錯!!!
(6)接口可以用來實現解耦
/* * Lambda表達式就是接口的實現的一種方式,Lambda表達式的參數列表就是接口中抽象方法的參數列表 * Lambda表達式中所需要執行的功能就是接口中抽象方法具體實現要執行的功能 * * 左側: Lambda表達式的參數列表 * 右側: Lambda表達式中所需要執行的功能,即Lambda體 * */ public class LambdaDemo { public static void main(String[] args) { test1();//實現的接口無參 無返回值 test2("hello lambda from test2");//實現的接口有一個參數 無返回值 } /* * 語法格式一 :實現的接口無參 無返回值 * 左側直接寫() ,右側是實現接口的功能 * () -> System.out.println("Hello Lambda"); */ public static void test1(){ Runnable r1 = new Runnable() { @Override public void run() { System.out.println("Hello World from test1"); } }; r1.run(); System.out.println("--------------------------------"); //用lambda語法寫 Runnable r2 = () -> System.out.println("Hello Lambda from test1");//實現Runnable接口 r2.run(); } /* * 語法格式二 :實現的接口有一個參數 無返回值 * (X) -> System.out.println(x); * 當左側有且只有一個參數時,左側括號可以省略 * X -> System.out.println(x); */ public static void test2(String str){ Consumer<String> con = (x) -> System.out.println(x);//實現consumer接口 con.accept(str); System.out.println("--------------------------------"); //lambda語法寫 Consumer<String> con1 = x -> System.out.println(x);//實現consumer接口 con.accept(str); } }
接口實現策略設計模式 實例:
//接口 interface IStraegy{ public void operate(); } //錦囊1 class BackDoor implements IStraegy{ @Override public void operate() { System.out.println("找喬國老幫忙,讓吳國不殺劉備"); } } //錦囊2 class GoBack implements IStraegy{ @Override public void operate() { System.out.println("找吳國太幫忙,回國"); } } //錦囊3 class BackThree implements IStraegy{ @Override public void operate() { System.out.println("孫尚香斷后"); } } //環境類 class Context{ private IStraegy istraegy; //構造器 //接口類型的引用指向一個實現了該接口的對象,這里傳入實現了該接口的對象 public Context(IStraegy istraegy) { this.istraegy = istraegy; } public void operate() { this.istraegy.operate(); } } //策略設計模式 public class TextDemo02 { public static void main(String[] args) { //使用一個接口引用指向對象 //USB接口類引用可以指向一個實現了USB接口的對象 // IStraegy con = new BackDoor(); // con.operate(); Context context; System.out.println("----剛到,拆第一個錦囊-----"); context = new Context(new BackDoor()); context.operate(); System.out.println("\n\n"); System.out.println("-----劉備樂不思蜀,拆第二個錦囊-----"); context = new Context(new GoBack()); context.operate(); System.out.println("\n\n"); System.out.println("----孫權追兵,拆第三個錦囊-----"); context = new Context(new BackThree()); context.operate(); System.out.println("賠了夫人又折兵"); }
}
該實例中使用了簡單的策略設計模式(策略設計模式:體現了高內聚,低耦合)
簡單介紹策略設計模式
策略(Strategy)模式
該模式定義了一系列算法,並將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬於對象行為模式,它通過對算法進行封裝,把使用算法的責任和算法的實現分割開來,並委派給不同的對象對這些算法進行管理。
語法:
(1)抽象策略(Strategy)類:定義了一個公共接口,各種不同的算法以不同的方式實現這個接口,環境角色使用這個接口調用不同的算法,一般使用接口或抽象類實現。
(2)具體策略(Concrete Strategy)類:實現了抽象策略定義的接口,提供具體的算法實現。
(3)環境(Context)類:持有一個策略類的引用,最終給客戶端調用。
策略模式的主要優點如下。
- 多重條件語句不易維護,而使用策略模式可以避免使用多重條件語句。
- 策略模式提供了一系列的可供重用的算法族,恰當使用繼承可以把算法族的公共代碼轉移到父類里面,從而避免重復的代碼。
- 策略模式可以提供相同行為的不同實現,客戶可以根據不同時間或空間要求選擇不同的。
- 策略模式提供了對開閉原則的完美支持,可以在不修改原代碼的情況下,靈活增加新算法。
- 策略模式把算法的使用放到環境類中,而算法的實現移到具體策略類中,實現了二者的分離。
其主要缺點如下。
- 客戶端必須理解所有策略算法的區別,以便適時選擇恰當的算法類。
- 策略模式造成很多的策略類。
本文中策略設計模式內容借鑒於:http://c.biancheng.net/view/1378.html