假设我有以下内容
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。我仅链接了许多问题之一,您可以轻松地在许多博客上搜索有关此问题的博客。