久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

跟我學(xué)(Effective Java 2)第21條:用函數(shù)對(duì)象表示策略

 印度阿三17 2019-06-05

第21條:用函數(shù)對(duì)象表示策略

有些語(yǔ)言支持函數(shù)指針(function pointer)、代理(delegate),、lambda表達(dá)式(lambda expression),,或者支持類似的機(jī)制,允許程序把“調(diào)用特殊函數(shù)的能力”存儲(chǔ)起來(lái)并傳遞這種能力,。這種機(jī)制通常用于允許函數(shù)的調(diào)用者通過傳入第二個(gè)函數(shù),,來(lái)指定自己的行為。

C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的qsort函數(shù)要求用一個(gè)指向comparator函數(shù)的指針作為參數(shù),,它用這個(gè)函數(shù)來(lái)比較待排序的元素,。比較器有兩個(gè)參數(shù),都是指向元素的指針,。通過傳遞不同的比較器函數(shù),,可以獲得不同的排列順序,這是策略模式的一個(gè)例子,。比較器函數(shù)代表一種為元素排序的策略,。

什么是策略模式?策略模式定義了一系列的算法,,并將每一個(gè)算法封裝起來(lái),,而且使它們還可以相互替換,。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。

public class StringLengthComparator {
    private StringLengthComparator() {
    }

    public static final StringLengthComparator INSTANCE = new StringLengthComparator();

    public int compare(String str1,String str2){
        return str1.length() - str2.length();
    }
    //以上內(nèi)容用靜態(tài)單例模式 執(zhí)行策略 靈活性低,。所以設(shè)計(jì)策略模式時(shí),,還要定義一個(gè)策略接口。而實(shí)現(xiàn)時(shí)往往采用匿名內(nèi)部類來(lái)實(shí)現(xiàn),。

}

為了把StringLengthComparator實(shí)例傳遞給方法,,需要適當(dāng)?shù)膮?shù)類型。使用StringLengthComparator并不好,,因?yàn)榭蛻舳藢o(wú)法傳遞任何其他的比較策略,。相反,我們要定義一個(gè)Comparator接口,,并修改StringLengthComparator來(lái)實(shí)現(xiàn)這個(gè)接口,。換句話說,我們?cè)谠O(shè)計(jì)具體的策略類時(shí),,還需要定義一個(gè)策略接口(strategy interface),,如下所示:

public interface Comparator<T> {
     public int compare(T t1,T t2);
 }

因?yàn)椴呗越涌诒挥米魉芯唧w策略實(shí)例的類型,所以我們并不需要為了導(dǎo)出具體策略,,而把具體策略做成公有的,。相反,“宿主類(host class)”還可以導(dǎo)出公有的靜態(tài)域(或者靜態(tài)工廠方法),,其類型為策略接口,,具體的策略接口類可以是宿主類的私有嵌套類。下面的例子使用靜態(tài)成員類,,而不是匿名類,,以便允許具體的策略類實(shí)現(xiàn)第二個(gè)接口Serializable:

//已Comparator為策略接口 靜態(tài)內(nèi)部類為實(shí)現(xiàn),可以用于多實(shí)現(xiàn) ,,如序列化
class Host{
    private static class StrLenCmp implements Comparator<String>, Serializable{
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    }

    public static final Comparator<String> STRING_COMPARATOR_LENGTH= new StrLenCmp();
}

簡(jiǎn)而言之,,函數(shù)指針的主要用途就是實(shí)現(xiàn)策略(strategy)模式。為了在Java中實(shí)現(xiàn)這種模式,,要聲明一個(gè)接口來(lái)表示該策略,,并且為每個(gè)具體策略聲明一個(gè)實(shí)現(xiàn)了該接口的類。當(dāng)一個(gè)具體策略只被使用一次時(shí),,通常使用匿名類來(lái)聲明和實(shí)例化這個(gè)具體策略模類,。當(dāng)一個(gè)具體策略是設(shè)計(jì)用來(lái)重復(fù)使用的時(shí)候,它的類通常就要被實(shí)現(xiàn)為私有的靜態(tài)成員類,,并通過公有的靜態(tài)final域被導(dǎo)出,,其類型為該策略接口。

來(lái)源:http://www./content-1-225651.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多