假设我有以下内容

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


Strategy和TestingLibrary都是抽象的,因为它们需要由提供的getClosingTime

trait Market {
    def getClosingTime: String
}


具体的实现可能是

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


在运行时,我希望能够指定特定的Strategy和TestingLibrary都在使用LSE。这意味着当调用任一方法的getClosingTime时,它们都应具有返回“ 16:35:00”的具体实现。我在想类似的东西

val lseStrategy = new Strategy with LSE


我想尽可能地坚持特质,但不知道如何将LSE与TestingLibrary混合使用。也许我的整个方法需要修改,但是主要的业务规则是:


策略有一个TestingLibrary
Strategy和TestingLibrary都依赖于抽象方法getClosingTime
在运行时,getClosingTime应该具有相同的具体实现
策略在构造函数中不应使用任何参数(由于可能会进一步扩展,
需要转换为特征)
策略的用户不应该对TestingLibrary有任何了解


目前,我正在迷惑中发现许多不同的选择。在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();}
}


但是我发现“如果”做事是一种丑陋的方式,因为增加新市场会涉及不必要地重新编译策略

最佳答案

您要查找的称为Cake Pattern。我仅链接了许多问题之一,您可以轻松地在许多博客上搜索有关此问题的博客。

10-02 21:45