Scala Cake 模式作为依赖注入的坏面



让我们看看下面这个非常简单的蛋糕图案示例:

trait PrintSomething{
def printSomeThing(s:String):Unit
}
trait PrintSomethingToConsole extends PrintSomething{
override def printSomeThing(s: String): Unit = println("Print To Console!!!")
}
trait PrintSomethingToLog extends PrintSomething{
override def printSomeThing(s: String): Unit = println("Print To Log!!!")
}
class MyAction{
self:PrintSomething =>
printSomeThing("This is it")
}
new MyAction with PrintSomethingToConsole
new MyAction with PrintSomethingToLog

我在一些博客中看到这种模式的坏面正在被打破Open-Close PrincipleInterface Segregation Principle.

据我了解,无论注入哪个PrintSomething特征,都可以覆盖MyAction中的printSomething方法并修改功能:

class MyAction{
self:PrintSomething =>
override def printSomeThing(s: String): Unit = println("I just Broke Open-Close Principle!!!!! ")
}

我说的对吗?

但是我不明白我怎么能在这里违反Interface Segregation Principle。有人可以详细说明吗?

我认为与开闭原则没有任何冲突。您的所有类和特征都可以扩展,也可以关闭以进行修改。而且由于它们只有一种方法,因此接口隔离原则并不真正适用!

即使您在MyAction类中覆盖printSomeThing,您仍然没有违反任何一项原则。所有对象都保持打开状态以进行扩展(您可以扩展它们)并关闭以进行修改(您无法更改它们的行为)。PrintSomethingToLog的实例将始终打印到日志中;您无法修改它以打印到控制台。

PrintSomething的实例可能有不同的printSomeThing实现,但这只是通过继承的多态性;这并不意味着PrintSomething可以修改,因为PrintSomething是一个接口,而不是一个具体的类,你不能改变接口。

最新更新