2011-07-27 44 views
3

假設我有以下如何在Scala中建立以下關係?

abstract class Strategy { 
    val lib: TestingLibrary = ... 
} 

雙方戰略和TestingLibrary是抽象的,因爲它們需要getClosingTime通過

trait Market { 
    def getClosingTime: String 
} 

提供具體的實現可能是

trait LSE extends Market { 
    def getClosingTime = "16:35:00" 
} 

在運行時,我想能夠指定特定的策略和測試庫都使用LSE。這意味着當調用getClosingTime時,它們都應該有一個返回「16:35:00」的具體實現。我在想像

val lseStrategy = new Strategy with LSE 

我想堅持性狀如果可能,但不知道如何混合LSE與TestingLibrary。也許是我的整個方法需要修改,但主要業務規則:

  • 戰略,一個TestingLibrary
  • 戰略和TestingLibrary都依賴於抽象方法getClosingTime
  • getClosingTime應該有相同的具體實施無論是在運行時
  • 戰略應在構造函數中沒有參數(由於進一步擴展它可能 需要被轉換爲特徵)戰略
  • 用戶不應該知道什麼TestingL文庫

此刻,我發現在不知所措的不同選項的數量。在Java中我不喜歡的東西下面

class LSETestingLibrary extends TestingLibrary { 
     String getClosingTime {return "16:35:00"} 
} 

class Strategy { 
    TestingLibrary lib; 
    Strategy(Market market) { 
     if (market == LSE) lib = new LSETestingLibrary(); 
    } 
    String getClosingTime { return lib.getClosingTme();} 
} 

,但我覺得「如果」醜陋的方式做事情,因爲增加了新的市場將涉及不必要的重新編譯戰略

回答

4

你要找的是所謂的Cake Pattern 。我僅僅鏈接了許多問題中的一個,並且您可以輕鬆地在Google上搜索許多關於此問題的博客。