接口(策略設計模式)

總結接口的知識點html

(菜鳥一隻,有侵權或者不足之處請指出,謝謝)java

 

Java接口算法

   接口是一系列方法的聲明,是一些方法特徵的集合,一個接口只有方法的特徵沒有方法的實現,所以這些方法能夠在不一樣的地方被不一樣的類實現,而這些實現能夠具備不一樣的行爲(功能)。
 
 語法:
 使用關鍵字interface關鍵字來定義。

 注意:定義的接口文件仍然是.java文件。雖然聲明的時候使用interface關鍵字,編譯以後仍然是.class設計模式

 

    接口能夠理解爲一種特殊的類(能夠當作100%的抽象類),裏面所有是由常量和公共的抽象方法所組成,接口是解決Java沒法使用多繼承的一種手段,可是接口在實際中更多的做用是制定行爲標準的。ide

 

(1)咱們不能直接去實例化一個接口,由於接口中的方法都是抽象的,是沒有方法體的。this

  可是,咱們可使用接口類型的引用指向一個實現了該接口的對象,而且能夠調用這個接口中的方法。(實際上就是使用了Java中多態的特性),好比:spa

  IStraegy con = new BackDoor();(語法: 接口名 接口類指引名 = new 實現了接口對象() ).net

  con.operate();//經過接口類指引名調用方法設計

  (我的以爲這是很是實用的)code

 

(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)類:持有一個策略類的引用,最終給客戶端調用。

策略模式的主要優勢以下。

  1. 多重條件語句不易維護,而使用策略模式能夠避免使用多重條件語句。
  2. 策略模式提供了一系列的可供重用的算法族,恰當使用繼承能夠把算法族的公共代碼轉移到父類裏面,從而避免重複的代碼。
  3. 策略模式能夠提供相同行爲的不一樣實現,客戶能夠根據不一樣時間或空間要求選擇不一樣的。
  4. 策略模式提供了對開閉原則的完美支持,能夠在不修改原代碼的狀況下,靈活增長新算法。
  5. 策略模式把算法的使用放到環境類中,而算法的實現移到具體策略類中,實現了兩者的分離。


其主要缺點以下。

    1. 客戶端必須理解全部策略算法的區別,以便適時選擇恰當的算法類。
    2. 策略模式形成不少的策略類。

 

本文中策略設計模式內容借鑑於:http://c.biancheng.net/view/1378.html

相關文章
相關標籤/搜索