Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 《Android之大話設計模式》--設計原則 第一章:針對接口編程 不要針對實現編程

《Android之大話設計模式》--設計原則 第一章:針對接口編程 不要針對實現編程

編輯:Android開發實例

應用場景舉例

 

“十六年後 在此重會;夫妻情深 勿失信約”,悲痛欲絕的楊過跑到斷腸崖,看到小龍女親手留在石壁上的文字,即驚喜又痛苦不欲生:“十六年!為什麼要等到十六年?!”。

但是信約已定,癡情的楊過也只能等十六年了。

離開斷腸崖後,楊過一邊開始了自己的苦苦的等待與思戀,一邊寄情練功,當然開始時 候也忘不了吃那療傷的草藥。後來楊過巧遇了千年神雕,和神雕一見如故,從此便開始修煉獨孤求敗的武功。無事可做,寄情練劍倒也不失為人生的一大快事。“相思無用,唯別而已。別期若有定,千般煎熬又何如?莫道黯然銷魂,何處柳暗花明?!”,驚天地泣鬼神的黯然銷魂掌就這樣誕生了。時 光飛逝,恍惚間快過了十六年。此時,楊過的神功已成,想象著十六年約期就將來臨,心中想象著自己一生的摯愛,不免感慨和激動萬分!在祭拜過求敗他老人家之後,楊過和神雕一起開始去赴那場長達十六年之久的約會。令眾生激動和艷羨。

再出江湖的楊過懲奸除惡、幫扶弱小,很快就俠名遠播,被人尊稱為“神雕俠”。自己心中想象著小龍女過往的一笑一颦,想象著她是怎麼度過這十六年的,不禁催生了更加濃烈的相思和相見之情。

千呼萬喚,終於,這一天來到!

斷腸崖邊,佳人芳蹤跡未現,過兒萬念俱灰,縱身跳下懸崖…

幸好懸崖下面是深淵,楊過並沒有死,被水沖到了岸邊的楊過蘇醒過來後,看到了很多小蜜蜂,他一眼就認出了這是小龍女樣的蜜蜂,莫非龍兒就在附近?最後在深潭水下,楊過找到了自己苦苦等待了十六年的摯愛。原來小龍女得知自己無藥可救,也縱身跳下斷腸崖,十六年之期只不過是為了讓楊過不要輕生。但是跳崖後的小龍女並沒有死掉,接著就在谷底一個世外桃源的地方慢慢的療傷,竟然完全康復了。真是有情人終成眷屬,有情人終成名人。

 

定義: 

接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此 這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。

      接口是對抽象的抽象。

      接口就是標准,就是承諾。

      針對接口編程,不要針對具體編程是依賴倒轉原則的另外一種表述。

      針對接口編程又稱為面向接口編程,針對接口編程就是要先設計一系列的接口,把設計和實現分離開,使用時只需引用接口即可,也由於系統各部分的解耦合。如下圖所示:

故事分析: 

       “十六年後 在此重會;夫妻情深勿失信約”就是針對接口編程的一個絕妙的例子。而且最後還加了“信約”一次。言外之意就是說我們說好了要十六年在此地重逢,我們倆都要遵照此約定。根據上面的故事,小龍女和楊過制定好接口後,就縱身跳下了懸崖,不管自己的過兒了,因為她此時已經不用關心過兒怎麼去再十六年後河自己相見,只要十六年後在此地相見即可,也就是說小龍女針對和使用都是接口,至於楊過怎麼實現,她此時已經身患絕症而無法顧及了。而楊過看過此約定後,雖然無奈,但也只好照辦。具體實現如下:回去吃斷腸草調理自己,然後以神雕為伴練習武功,知道練成了黯然銷魂掌而神功大成,然後就是在江湖上做俠義之事,然後就是按照信約與十六年後來 到斷腸崖邊;而小龍女就在谷底慢慢的調養,十六年後身體早已康復,而且越發迷人了。當楊過沒有見到小龍女時縱身跳崖,遵照了“問世間情為何物,直教人生死相許”標准。

       總結一下:小龍女和楊過定下接口,然後各自針對接口各自獨立的做事,最終得以相見。

       針對接口編程是未來提高程序的可維護性、可伸縮性和可復用性。如果你在一個類中直接使用另外的一個,這樣就把兩個類緊密的聯系在了一起,以後如果想做出改變就很難了。如果針對接口編程,當業務變化時我們只需要用一個新的類實現接口即可,而客戶端依舊可以使用接口引用新的類的,同時也保證了客戶端的不變性。這樣客戶端和實現端互不影響,保持了各自的相對獨立性。正如小龍女和楊過的,他們樹立了十六年制約後,就不用關心彼此的如何去赴這場約定,只需要按照約定做事就OK了。互不影響,自由在在。如下圖所示:

Java代碼實現: 

       新建一個“信約”的接口,這個接口是楊過和小龍女都必須通過自己的方式實現的。代碼如下:

 

package com.diermeng.designPattern.dating;

/*

 * 楊過和小龍女定下的約定接口

 */

public interface Dating {

    /*

     * 約定的接口

     */

    public void dating();

}

 

       然後分別建立楊過和小龍女的實現類,分別實現上面的接口。代碼依次如下:

 

package com.diermeng.designPattern.dating.impl;

 

import com.diermeng.designPattern.dating.Dating;

/*

 * 楊過對接口的實現

 */

public class Yangguo implements Dating {

    /*

     * 姓名

     */

    String name;

 

    /*

     * 默認空構造方法

     */

    public Yangguo(){}

    /*

     * 傳入name參數的構造方法

     */

    public Yangguo(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

 

    /*

     * (non-Javadoc)

     * @see com.diermeng.dating.inter.Dating#dating()

     * 楊過對約定的實現

     */

    public void dating() {

        if(this.getName()!=null){

            System.out.println(this.getName() " : " "十六年後 在此重會;夫妻情深 勿失信約");

        }

        else{

            System.out.println("十六年後 在此重會;夫妻情深 勿失信約");

        }

    }

}

 

 

 

 

 

package com.diermeng.designPattern.dating.impl;

 

import com.diermeng.designPattern.dating.Dating;

/*

 * 小龍女對接口的實現

 */

public class XiaoLongnv implements Dating{

    /*

     * 姓名

     */

    String name;

 

    /*

     * 默認空構造方法

     */

    public XiaoLongnv(){}

 

    /*

     * 傳入name參數的構造方法

     */

    public XiaoLongnv(String name) {

        this.name = name;

    }

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

 

    /*

     * (non-Javadoc)

     * @see com.diermeng.dating.inter.Dating#dating()

     * 小龍女對約定的實現

     */

    public void dating() {

        if(this.getName()!=null){

            System.out.println(this.getName() " : " "十六年後 在此重會;夫妻情深 勿失信約");

        }

        else{

            System.out.println("十六年後 在此重會;夫妻情深 勿失信約");

        }

    }

 

}

 

 

 

 

建立一個測試類,代碼如下:

package com.diermeng.designPattern.dating.client;

import com.diermeng.designPattern.dating.Dating;

import com.diermeng.designPattern.dating.impl.XiaoLongnv;

import com.diermeng.designPattern.dating.impl.Yangguo;

/*

 * 對楊過和小龍女約定進行測試的客戶端

 */

public class DatingTest {

 

    public static void main(String[] args)

    {

        //分別實例化實例化

        Dating yangguo = new Yangguo("過兒");

        Dating xiaoLongnv = new XiaoLongnv("龍兒");

 

        //調用各自的方法

        yangguo.dating();

        xiaoLongnv.dating();

    }

}

 

 

程序運行結果如下:

過兒 : 十六年後 在此重會;夫妻情深 勿失信約

龍兒 : 十六年後 在此重會;夫妻情深 勿失信約              

 

已有應用簡介: 

Java是相面對象編程的語言,而面向對象編程的核心之一就是要針對針對接口編程、不要針對實現編程,在Java API中的標志接口java.io.Serializable和java.rmi.Remote等就是我們經常遇到的,下面以 java.io.Serializable為例說明一下,源代碼如下:

package java.io;

public interface Serializable{}

UML圖形如下圖所示:

 

當然在J2EE框架的使用中到處都是針對接口編程的身影。例如在www.babasport.com中幾乎每一處都是針對接口編程的,令人印象非常深刻的一點就是巴巴運動網把對數據庫的CRUD等基本操作封裝在了一個統一接口中,這給以後的代碼的編寫和數據庫的操作帶來了極大的方便,當然這裡也使用了Java 5的泛形技術。有興趣的讀者可以去學習巴巴運動網的源代碼。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved