2019-02-11——Java 鴨子模型

鴨子類型(duck typing)是動態(tài)類型的一種風(fēng)格穿香。在這種風(fēng)格中一個對象的有效語義不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口漓糙,而是由當前的方法和屬性的集合決定。

"當看到一只鳥走起來像鴨子奕筐、游泳起來像鴨子泪酱、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子茴肥。"

在鴨子類型中坚踩,關(guān)注的不是對象的類型本身,而是它是如何使用的瓤狐。
由于鴨子類型機制常見于動態(tài)語言瞬铸,我們先看個Python的例子:


class Duck:
    def quack(self): 
        print "鴨子叫"
    def feathers(self): 
        print "鴨子有羽毛"
 
class Person:
    def quack(self):
        print "模仿鴨子叫"
    def feathers(self): 
        print "人沒有羽毛"
 
def in_the_forest(duck):
    duck.quack()
    duck.feathers()
 
def game():
    donald = Duck()
    john = Person()
    in_the_forest(donald)
    in_the_forest(john)
 
game()

在該例中in_the_forest方法不關(guān)注傳入的參數(shù)是那種類型,而關(guān)心該對象是否有特定的方法础锐。

Java 實現(xiàn)鴨子類型

  • 其中一種方式是通過多態(tài)
public interface Performer {
    void eat();
    void walk();
}




public class Dog implements Performer {
    @Override
    public void eat() {
        System.out.println("狗吃狗糧");
    }

    @Override
    public void walk() {
        System.out.println("狗跑的很快");
    }
}




public class Cat implements Performer {
    @Override
    public void eat() {
        System.out.println("貓吃貓糧");
    }

    @Override
    public void walk() {
        System.out.println("貓走路很輕盈");
    }
}




public class T {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        perform(dog);
        perform(cat);
    }

    static <T extends Performer> void perform(T duck){
        duck.eat();
        duck.walk();
    }
}

嚴格來說這種實現(xiàn)并非準確的鴨子模型嗓节,因為perform方法的參數(shù)必須實現(xiàn)了Performer接口,即關(guān)注了對象的本身的類型

  • 常用方式是使用反射
public class Cat {
    public void eat() {
        System.out.println("貓吃貓糧");
    }

    public void walk() {
        System.out.println("貓走路很輕盈");
    }
}




public class Dog {
    public void eat() {
        System.out.println("狗吃狗糧");
    }

    public void walk() {
        System.out.println("狗跑的很快");
    }
}




public class T {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        try {
            perform(dog);
            perform(cat);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    static void perform(Object duck) throws Exception {
        Class clazz = duck.getClass();
        Method eat = clazz.getMethod("eat");
        eat.invoke(duck);
        Method walk = clazz.getMethod("walk");
        walk.invoke(duck);
    }
}

比起使用多態(tài)皆警,使用反射更接近于鴨子模型拦宣,perform方法不關(guān)心傳入的對象的類型,只關(guān)心該對象是否擁有指定的方法。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸵隧,一起剝皮案震驚了整個濱河市桐愉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掰派,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左痢,死亡現(xiàn)場離奇詭異靡羡,居然都是意外死亡,警方通過查閱死者的電腦和手機俊性,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門略步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定页,你說我怎么就攤上這事趟薄。” “怎么了典徊?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵杭煎,是天一觀的道長。 經(jīng)常有香客問我卒落,道長羡铲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任儡毕,我火速辦了婚禮也切,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腰湾。我一直安慰自己雷恃,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布费坊。 她就那樣靜靜地躺著倒槐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葵萎。 梳的紋絲不亂的頭發(fā)上导犹,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音羡忘,去河邊找鬼谎痢。 笑死,一個胖子當著我的面吹牛卷雕,可吹牛的內(nèi)容都是我干的节猿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滨嘱!你這毒婦竟也來了峰鄙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤太雨,失蹤者是張志新(化名)和其女友劉穎吟榴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囊扳,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吩翻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锥咸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭瞎。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搏予,靈堂內(nèi)的尸體忽然破棺而出熊锭,到底是詐尸還是另有隱情,我是刑警寧澤雪侥,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布碗殷,位于F島的核電站,受9級特大地震影響校镐,放射性物質(zhì)發(fā)生泄漏亿扁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一鸟廓、第九天 我趴在偏房一處隱蔽的房頂上張望从祝。 院中可真熱鬧,春花似錦引谜、人聲如沸牍陌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毒涧。三九已至,卻和暖如春贝室,著一層夾襖步出監(jiān)牢的瞬間契讲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工滑频, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捡偏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓峡迷,卻偏偏與公主長得像银伟,于是被迫代替她去往敵國和親你虹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 沒有寫作彤避,他至少還要再奮斗十年傅物。 會說的人很多,會寫的人很少…… 焦慮時代下的青年危機 1琉预,寫作是利用碎片化的時間...
    楊清_0608閱讀 215評論 2 0
  • 事件沖突 解決scrollView的滑動事件與子視圖按鈕事件沖突self.scrollView.panGestur...
    silence_xz閱讀 341評論 0 0
  • 今天研究生命數(shù)字董饰,開始從多維度、多視角去立體地看待身邊的人圆米,最主要的是深度認識自己尖阔。 只要心中有“數(shù)”,一切盡在掌...
    晶晶_f6dd閱讀 172評論 0 0