Scala 参与者在 Savings BankAccount 程序中的用例



这不是任何类型的赋值。我正在学习Scala和Scala并发,最好是与AkkaActors一起学习。我这样做的方法之一是提出一些简单的程序设计,并尝试提出一个涉及应用于设计的Actors/并发性的实现:

我想编写的程序是一个储蓄银行账户应用程序,它有一个输入组件和一个输出组件
XYZ银行向客户提供开设储蓄账户的计划
1)要求客户ABC在开户时提供其个人详细信息
2)客户可以将钱存入他/她的账户吗
3)客户可以从他/她的账户中提款
4)如果账户余额低于100美元,则会通知客户。(例如,当客户从应用程序的输入屏幕中选择选项3时,他/她会被告知当时的账户余额低于100美元,因此无法提款,除非他们向其中存入更多的钱。)
5)应用程序应能够维护客户的交易历史,并显示交易历史(例如:当应用程序显示输入屏幕时,其中一个选项是-显示交易历史。当提示时选择该选项并附上数字时,应用程序应显示余额)
程序的输入部分由命令行上显示的4个选项组成:1。创建帐户2。存款3。提款。4.显示交易历史


现在,我正在努力实现的是理解和识别:
1) 在这样的程序中,Akka actors/Scala并发库的用例是什么?该应用程序中的并发角色(如果有的话)是什么?
我最能利用哪些Scala集合库?

我希望这能解决问题:http://alexminnaar.com/introduction-to-the-multithreading-problem-and-the-akka-actor-solution.html

注意:我刚刚注意到这篇文章很旧。我将在2018年发布答案。

更新1:(来自链接的解释,在评论中提到)

这是多种可能策略中的一种方法。

有两个Actor使用

  1. 银行账户-管理余额

        object WireTransfer {
        case class Transfer(from: ActorRef, to: ActorRef, amount: BigInt)
        case object Done
        case object Failed
        }
        //actor implementing the actions of a wire transfer between two bank account actors
        class WireTransfer extends Actor {
        import WireTransfer._
        def receive = LoggingReceive {
        //If Transfer message is received, send withdraw message to 'from' and wait for reply
        case Transfer(from, to, amount) =>
        from ! BankAccount.Withdraw(amount)
        context.become(awaitFrom(to, amount, sender))
        }
        //If Withdraw was successful, send deposit to other bank account actor, or else give them a failure message
        def awaitFrom(to: ActorRef, amount: BigInt, customer: ActorRef): Receive = LoggingReceive {
        case BankAccount.Done =>
        to ! BankAccount.Deposit(amount)
        context.become(awaitTo(customer))
        case BankAccount.Failed =>
        customer ! Failed
        context.stop(self)
        }
        //If deposit was successful, send 'Done' to original actor that sent Transfer message
        def awaitTo(customer: ActorRef): Receive = LoggingReceive {
        case BankAccount.Done =>
        customer ! Done
        context.stop(self)
        }
        }
    
  2. WireTransfer-将余额从一个帐户转移到另一个帐户。

        object WireTransfer {
        case class Transfer(from: ActorRef, to: ActorRef, amount: BigInt)
        case object Done
        case object Failed
        }
        //actor implementing the actions of a wire transfer between two bank account actors
        class WireTransfer extends Actor {
        import WireTransfer._
        def receive = LoggingReceive {
        //If Transfer message is received, send withdraw message to 'from' and wait for reply
        case Transfer(from, to, amount) =>
        from ! BankAccount.Withdraw(amount)
        context.become(awaitFrom(to, amount, sender))
        }
        //If Withdraw was successful, send deposit to other bank account actor, or else give them a failure message
        def awaitFrom(to: ActorRef, amount: BigInt, customer: ActorRef): Receive = LoggingReceive {
        case BankAccount.Done =>
        to ! BankAccount.Deposit(amount)
        context.become(awaitTo(customer))
        case BankAccount.Failed =>
        customer ! Failed
        context.stop(self)
        }
        //If deposit was successful, send 'Done' to original actor that sent Transfer message
        def awaitTo(customer: ActorRef): Receive = LoggingReceive {
        case BankAccount.Done =>
        customer ! Done
        context.stop(self)
        }
        }
    

最新更新