国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于Scala Trait的設計模式

開發 開發工具
之前,我重點介紹了那些已經融入Scala語法的設計模式。今天要介紹的兩個設計模式,則主要與Scala的trait有關。

[[184365]]

《作為Scala語法糖的設計模式》中,我重點介紹了那些已經融入Scala語法的設計模式。今天要介紹的兩個設計模式,則主要與Scala的trait有關。

Decorator Pattern

在GoF 23種設計模式中,Decorator Pattern算是一個比較特殊的模式。它充分利用了繼承和組合(或者委派)各自的優勢,將它們混合起來,不僅讓優勢擴大,還讓各自的缺點得到了抵消。Decorator模式的核心思想其實是“職責分離”,即將要裝飾的職責與裝飾的職責分離,從而使得它們可以在各自的繼承體系下獨立演化,然后通過傳遞對象(組合)的形式完成對被裝飾職責的重用。

從某種角度來講,裝飾職責與被裝飾職責之間的分離與各自抽象,不妨可以看做是Bridge模式的變種。但不同之處在于Decorator模式又額外地引入了繼承,但不是為了重用,而是為了多態,使得裝飾者因為繼承自被裝飾者,從而擁有了被裝飾的能力。所以說,繼承的引入真真算得上是點睛之筆了。

理解Decorator模式,一定要理解繼承與組合各自扮演的角色。簡而言之,就是:

  • 繼承:裝飾者的多態
  • 組合:被裝飾者的重用

正因為此,在Java代碼中實現Decorator模式,要注意裝飾器類在重寫被裝飾器的業務行為時,一定要通過傳入的對象來調用被裝飾者的行為。假設傳入的被裝飾者對象為decoratee,則調用時就一定是decoratee,而不是super(由于繼承的關系,裝飾類是可以訪問super的)。

例如BufferedOutputStream類作為裝飾類,要裝飾OutputStream的write行為,就必須這樣實現:

  1. public interface OutputStream { 
  2.     void write(byte b); 
  3.     void write(byte[] b); 
  4. public class FileOutputStream implements OutputStream { /* ... */ } 
  5. public class BufferedOutputStream extends OutputStream { 
  6.     //這里是組合的被裝飾者     
  7.     protected final OutputStream decoratee; 
  8.     public BufferedOutputStream(OutputStream decoratee) { 
  9.         this.decoratee = decoratee; 
  10.     } 
  11.  
  12.     public void write(byte b) { 
  13.         //這里應該是調用decoratee, 而非super,雖然你可以訪問super     
  14.         decoratee.write(buffer) 
  15.     } 

然而,在Scala中實現Decorator模式,情況卻有些不同了。Scala的trait既體現了Java Interface的語義,卻又可以提供實現邏輯(相當于Java 8的default interface),并在編譯時采用mixin方式完成代碼的重用。換言之,trait已經***地融合了繼承與組合的各自優勢。因此,在Scala中若要實現Decorator模式,只需要定義trait去實現裝飾者的功能即可:

  1. trait OutputStream { 
  2.   def write(b: Byte) 
  3.   def write(b: Array[Byte]) 
  4. class FileOutputStream(path: String) extends OutputStream { /* ... */ } 
  5. trait Buffering extends OutputStream { 
  6.   abstract override def write(b: Byte) { 
  7.     // ... 
  8.     super.write(buffer) 
  9.   } 

在Buffering的定義中,根本看不到組合的影子,且在對write方法進行重寫時,調用的是super,這與我前面講到的內容背道而馳啊!

區別在于組合(delegation)的時機。在Java(原諒我,因為使用Scala的緣故,我對Java 8的default interface沒有研究,不知道是否與scala的trait完全相同)語言中,組合是通過傳遞對象方式完成的職責委派與重用,也就是說,組合是在運行時發生的。Scala的實現則不然,在trait中利用abstract override關鍵字來完成一種stackable modifications,這種方式被稱之為Stackable Trait Pattern。這種語法僅能用于trait,它表示trait會將某個具體類針對該方法提供的實現混入(mixin)到trait中。裝飾的客戶端代碼如下:

  1. new FileOutputStream("foo.txt") with Buffering 

FileOutputStream的write方法實現在編譯時就被混入到Buffering中。所以可以稱這種組合為靜態組合。

Dependency Injection

Dependency Injection(依賴注入或者稱為IoC,即控制反轉)其實應該與依賴倒置原則結合起來理解,首先應該保證不依賴于實現細節,而是依賴于抽象(接口),然后,再考慮將具體依賴從類的內部轉移到外面,并在運行時將依賴注入到類的內部。這也是Dependency Injection的得名由來。

在Java世界,多數情況下我們會引入框架如Spring、Guice來完成依賴注入(這并不是說依賴注入一定需要框架,嚴格意義上,只要將依賴轉移到外面,然后通過set或者構造器注入依賴,都可以認為是實現了依賴注入),無論是基于xml配置,還是annotation,或者Groovy,核心思想都是將對象之間的依賴設置(裝配)轉交給框架來完成。Scala也有類似的IoC框架。但是,多數情況下,Scala程序員會充分利用trait與self type來實現所謂的依賴注入。這種設計模式在Scala中常常被昵稱為Cake Pattern。

一個典型的案例就是將一個Repository的實現注入到Service中。在Scala中,就應該將Repository的抽象定義為trait,然后在具體的Service實現中,通過Self Type引入Repository:

  1. trait Repository { 
  2.   def save(user: User) 
  3. trait DatabaseRepository extends Repository { /* ... */ } 
  4. trait UserService {  
  5.   self: Repository =>  
  6.   def create(user: User) { 
  7.     //這里調用的是Repository的save方法 
  8.     //調用Self Type的方法就像調用自己的方法一般 
  9.     save(user) 
  10.   } 
  11.  
  12. //這里的with完成了對DatabaseRepository依賴的注入 
  13. new UserService with DatabaseRepository 

Cake Pattern遵循了Dependency Inject的要求,只是它沒有像Spring或者Guice那樣徹底將注入依賴的職責轉移給外部框架,而是將注入的權利交到了調用者手里。這樣會導致調用端代碼并沒有完全與具體依賴解耦,但在大多數情況下,這種輕量級的依賴注入方式,反而更討人喜歡。

在Scala開發中,我們常常會使用Cake Pattern。在我的一篇文章《一次設計演進之旅》中,就引入了Cake Pattern來完成將ReportMetadata依賴的注入。

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2009-09-09 14:09:35

Scala Trait

2015-09-28 13:48:55

云計算設計模式負載均衡

2009-09-09 11:37:08

Scala的模式匹配

2009-07-08 16:42:57

Scala語言設計

2010-08-02 16:19:00

ibmdw面向對象

2021-04-19 21:25:48

設計模式到元

2009-07-08 12:43:59

Scala ServlScala語言

2021-02-01 10:01:58

設計模式 Java單例模式

2013-12-04 14:19:40

JavaScript代碼重用

2020-10-31 17:33:18

Scala語言函數

2012-08-30 09:07:33

設計模式

2010-09-14 15:34:41

Scala

2023-11-02 21:11:11

JavaScript設計模式

2012-07-10 01:59:12

設計模式

2011-12-15 01:12:59

ibmdw

2017-07-07 10:55:14

數據庫MongoDB設計模式

2012-10-29 11:16:13

2024-07-31 08:12:33

2022-11-30 17:05:33

代碼程序場景

2022-11-14 08:44:56

前端門面模式接口
點贊
收藏

51CTO技術棧公眾號

久久国产精品视频在线观看| 久久久久久91香蕉国产| 996这里只有精品| 精品99视频| 久久久亚洲网站| 日韩av毛片| 一区二区免费在线| 国产精品天天av精麻传媒| 蜜臀av一区二区三区| 999在线免费观看视频| re久久精品视频| 68精品久久久久久欧美| 日日夜夜亚洲精品| 亚洲免费av电影| 亚洲人成在线网站| 亚洲精品黄网在线观看| 69成人在线| 欧美精品免费视频| 色网站在线看| 欧美精品tushy高清| 电影av一区| 欧美性感一区二区三区| 国产在线观看免费网站| 欧美综合在线视频| 免费观看成人高潮| 欧美精品精品一区| 一级片在线播放| 一本一本大道香蕉久在线精品| 91热爆在线观看| 亚洲精品伦理在线| 黄色毛片视频| 欧美午夜片欧美片在线观看| 噜噜噜在线观看播放视频| 日韩欧美在线一区| 日韩成人黄色| 欧美精品久久久久久久久老牛影院| 日本成人在线播放| 亚洲国产精品久久久| 五月天av在线| 日韩在线不卡视频| 日韩影视在线观看| 成人午夜在线影院| 国产精品主播| av无码久久久久久不卡网站| 久久久噜噜噜久久人人看 | 久久成人资源| 精品一区二区成人精品| 人妻少妇精品久久| 亚洲精品一卡二卡| 国产鲁鲁视频在线观看特色| 色老头一区二区三区| 国产乱码精品一区二区三区四区| 国外成人在线视频网站| 国产精品亚洲视频| 8848hh四虎| 这里只有精品视频在线观看| 精品亚洲a∨| 国产精品影片在线观看| 久久先锋资源| 成人精品小视频| 欧美日韩色综合| 粉嫩av一区二区三区四区五区 | 国产精品国产亚洲精品| 国产精品视频一区二区三区四| 欧美+日本+国产+在线a∨观看| 少妇特黄a一区二区三区| 久久色视频免费观看| 小草av在线播放| 中文字幕一精品亚洲无线一区| 精品九九在线| 在线免费一区| 亚洲国产日韩a在线播放| 成人bbav| 91久热免费在线视频| 成人免费av资源| 电影在线高清| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 国产厕所精品在线观看| 99久久婷婷国产综合精品电影| 青青操在线视频| 色伦专区97中文字幕| 雨宫琴音一区二区在线| 欧美伦理片在线看| 亚洲激情免费观看| 欧美激情偷拍自拍| av天堂永久资源网| 精品国产成人在线影院| 成人网18免费网站| 免费黄色福利视频| 精品国产一区二区在线观看| 天天操夜夜操国产精品| 日日噜噜噜噜久久久精品毛片| 精品剧情v国产在线观看在线| 亚洲深夜福利在线观看| 久久精品无码中文字幕| 欧美高清视频一二三区| 日韩www.| avtt天堂资源网站| 伊人久久大香线蕉av一区二区| 欧美午夜精品| 中文字幕第5页| 欧美黄色片视频| 国产一区二区三区免费在线观看 | 性做久久久久久久免费看| 欧美系列精品| 中文字幕黄色大片| 欧美三级在线视频| 久久高清免费| 人与动性xxxxx免费视频| 久久久久久久久久亚洲| 成人午夜看片网址| 成人美女视频| 在线播放豆国产99亚洲| 欧美一卡二卡在线| 性伦欧美刺激片在线观看| av网站在线免费播放| 91亚洲精品久久久久久久久久久久| 国产精品国产馆在线真实露脸| 精品国产欧美| 国产精品免费观看久久| 亚洲人成网在线播放| 精品一区二区三区蜜桃| h片在线观看视频免费免费| 日韩欧美一区二区视频在线播放| 欧美日韩国产片| 最新日韩欧美| 成人影院在线看| 日本一区二区三区www| 91精品在线一区二区| 国产精品婷婷| 高清全集视频免费在线| 日韩.欧美.亚洲| 精品国产在天天线2019| 久久er精品视频| 日韩三区免费| 无码少妇一区二区三区芒果| 韩国三级电影久久久久久| 亚洲人123区| 久久久久电影| 欧美尤物美女在线| 亚洲精品一区二| 国产一区二区三区欧美| 久久久午夜精品| 日韩最新在线| 欧美挠脚心网站| 日本一区高清不卡| 亚洲人成网站777色婷婷| 久久你懂得1024| 国模精品一区| 免费网站成人| 免费看日本黄色| 欧美黑人xxxⅹ高潮交| 亚洲天堂网中文字| 波多野结衣一区| 成年人在线看| 中文字幕一区二区三区四区五区人 | 精品国产一区二区三区不卡| 精品一区二区三区不卡 | 无码人妻丰满熟妇区毛片18| 久久人人爽人人爽人人片av高请 | 欧美xxxx中国| 黄色免费在线观看| 无码人妻精品一区二区三区99v| 最近2019中文字幕在线高清| 中文字幕一区二区不卡| 欧美高清视频在线观看mv| av网站网址在线观看| 国产精品www在线观看| 国产精品高清免费在线观看| 欧美一区二区三区不卡| 26uuu欧美| 亚洲欧美综合| 国精品产品一区| 欧美在线一卡| 91九色丨porny丨国产jk| 国产精品免费一区豆花| 亚洲精品乱码久久久久久金桔影视 | 国产伦精品免费视频| 欧美va亚洲va香蕉在线| 国产午夜久久久久| 欧美91视频| 成人国产一区| 四虎精品在线| 欧美一级片免费播放| 国产女精品视频网站免费| 精品香蕉一区二区三区| 亚洲激情综合网| 蜜臀av性久久久久蜜臀aⅴ| 大奶一区二区三区| 欧美人与禽猛交乱配| 丝袜美女写真福利视频| 91社在线播放| 99视频在线播放| 欧美精品激情视频| 精品福利一区二区三区| 亚洲国产一区视频| 96av麻豆蜜桃一区二区| 欧美亚洲免费| 五月天久久777| 日韩精品中文字幕一区二区|