首页 > 解决方案 > 使用松散耦合实现新功能

问题描述

trait paymentTasks{
  def calculatePayment()
  def getData()
}

 class paymentcalculator{
    override def calculatePayment() ={
    //Implementation }

    }
    override defGetData() ={
    }
   }

如何调用该方法以减少代码依赖性并且不想使用 new 关键字

 class MyApp{
   val payment = new paymentcalculator
   //I don't want to instantiate like this wants this to be decoupled

 }

请建议我如何实现这一点,也可以在不更改现有代码的情况下完成未来的新更改。此外,建议在功能上执行此操作是否会更有效

标签: scalaoopdesign-patterns

解决方案


如果您想要编译时选择,那么只需将代码放入object

trait PaymentTasks {
  def calculatePayment()
  def getData()
}

object PaymentCalculator extends PaymentTasks {
  def calculatePayment() = ???
  def getData() = ???
}

class MyApp {
  val payment = PaymentCalculator.calculatePayment()
}

如果您想要运行时选择,最好的方法是使用依赖注入并在顶层创建支付对象并将其传递给需要它的代码。

object SimplePaymentCalculator extends PaymentTasks

object ComplexPaymentCalculator extends PaymentTasks

class MyApp {
  def myImplementation(tasks: PaymentTasks) = {
    val payment = tasks.calculatePayment()
  }

  val payment =
    if (???) {
      SimplePaymentCalculator
    } else {
      ComplexPaymentCalculator
    }

  myImplementation(payment)
}

推荐阅读