鍍金池/ 教程/ Scala/ 選擇瘦接口還是胖接口設(shè)計(jì)?
包對(duì)象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對(duì)象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對(duì)象 (二)
組合和繼承–定義 factory 對(duì)象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對(duì)象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對(duì)象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對(duì)象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對(duì)象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實(shí)現(xiàn)可疊加的修改操作

選擇瘦接口還是胖接口設(shè)計(jì)?

Trait 的一種主要應(yīng)用方式是可以根據(jù)類已有的方法自動(dòng)為類添加方法。也就是說,Trait 可以使得一個(gè)瘦接口變得豐滿些,把它變成胖接口。

選擇瘦接口還是胖接口的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)中常會(huì)面臨的在實(shí)現(xiàn)者與接口用戶之間的權(quán)衡。胖接口有更多的方法,對(duì)于調(diào)用者來說更便捷。客戶可以撿一個(gè)完全符合他們功能需要的方法。另一方面瘦接口有較少的方法,對(duì)于實(shí)現(xiàn)者來說更簡單。然而調(diào)用瘦接口的客戶因此要寫更多的代碼。由于沒有更多可選的方法調(diào)用,他們或許不得不選一個(gè)不太完美匹配他們所需的方法并為了使用它寫一些額外的代碼。

Java 的接口常常是過瘦而非過胖。例如,從 Java 1.4 開始引入的 CharSequence 接口,是對(duì)于字串類型的類來說通用的瘦接口,它持有一個(gè)字符序列。下面是把它看作 Scala 中 Trait 的定義:

trait CharSequence { 
  def charAt(index: Int): Char 
  def length: Int 
  def subSequence(start: Int, end: Int): CharSequence 
  def toString(): String 
}

盡管類 String 成打的方法中的大多數(shù)都可以用在任何 CharSequence 上,Java 的 CharSequence 接口定義僅提供了 4 個(gè)方法。如果 CharSequence 代以包含全部 String 接口,那它將為 CharSequence 的實(shí)現(xiàn)者壓上沉重的負(fù)擔(dān)。任何實(shí)現(xiàn) Java 里的 CharSequence 接口的程序員將不得不定義一大堆方法。因?yàn)?Scala 的 Trait 可以包含具體方法,這使得創(chuàng)建胖接口大為便捷。

在 Trait 中添加具體方法使得胖瘦對(duì)陣的權(quán)衡大大傾向于胖接口。不像在 Java 里那樣,在 Scala 中添加具體方法是一次性的勞動(dòng)。你只要在 Trait 中實(shí)現(xiàn)方法一次,而不再需要在每個(gè)混入 Trait 的方法中重新實(shí)現(xiàn)它。因此,與沒有 Trait 的語言相比,Scala 里的胖接口沒什么工作要做。

要使用 Trait 加強(qiáng)接口,只要簡單地定義一個(gè)具有少量抽象方法的 Trait——Trait 接口的瘦部分——和潛在的大量具體方法,所有的都實(shí)現(xiàn)在抽象方法之上。然后你就可以把豐滿了的 Trait 混入到類中,實(shí)現(xiàn)接口的瘦部分,并最終獲得具有全部胖接口內(nèi)容的類。