2012-11-17 3 views
3

저는 최근 스칼라 배우기를 시작했고 간단한 프로젝트를 시작하기위한 작은 프로젝트를 시작했습니다. 그러나, 나는 관찰자 패턴을 구현하려고 애 쓰고있다. This 답변은 주제를 터치하지만 어떻게 작동시키는 지 알 수 없습니다. 아래 링크는 위에 링크 된 답변의 코드입니다. 나는 대부분 "this : S =>"코드의 일부로 혼란 스럽다. 나는 거기에 어떤 종류의 기능이 있어야한다고 생각하지만 확실하지 않다. 제목 특성을 확장 할 클래스에서 튜플을 반환하도록하고 싶습니다.옵저버 패턴 구현

trait Observer[S] { 
def receiveUpdate(subject: S); 
} 

trait Subject[S] { 
this: S => 
private var observers: List[Observer[S]] = Nil 
def addObserver(observer: Observer[S]) = observers = observer :: observers 

def notifyObservers() = observers.foreach(_.receiveUpdate(this)) 
} 

답변

9

self 유형에 대한 Steve의 대답과 다른 코드 예제를 참조하십시오.

다음은 관찰자를 사용하는 일부 샘플 코드입니다. ObservedAccountAccountReporter 관찰자가 관찰 한 Subject입니다.

trait Observer[S] { 
    def receiveUpdate(subject: S); 
} 

trait Subject[S] { 
    this: S => 
    private var observers: List[Observer[S]] = Nil 
    def addObserver(observer: Observer[S]) = observers = observer :: observers 

    def notifyObservers() = observers.foreach(_.receiveUpdate(this)) 
} 

class Account(initialBalance: Double) { 
    private var currentBalance = initialBalance 
    def balance = currentBalance 
    def deposit(amount: Double) = currentBalance += amount 
    def withdraw(amount: Double) = currentBalance -= amount 
} 

class ObservedAccount(initialBalance: Double) extends Account(initialBalance) with Subject[Account] { 
    override def deposit(amount: Double) = { 
     super.deposit(amount) 
     notifyObservers() 
    } 
    override def withdraw(amount: Double) = { 
     super.withdraw(amount) 
     notifyObservers() 
    } 
} 


class AccountReporter extends Observer[Account] { 
    def receiveUpdate(account: Account) = 
     println("Observed balance change: "+account.balance) 
} 

의 행동에 보자 :

scala> val oa = new ObservedAccount(100.0) 
oa: ObservedAccount = [email protected] 

scala> val ar = new AccountReporter 
ar: AccountReporter = [email protected] 

scala> oa.addObserver(ar) 

scala> oa.deposit(40.0) 
Observed balance change: 140.0 

scala> oa.withdraw(40.0) 
Observed balance change: 100.0 
+0

구체적인 예를 들어 주셔서 감사합니다. 지금 잘 됐어. – Zavior

1

이것은 스칼라 자체 유형 (http://www.scala-lang.org/node/124 참조)입니다. 즉, Subject [S] 특성의 모든 구체적인 구현이 유형 S와 일치해야한다는 요구 사항을 표현합니다. 즉, 관찰 가능한 모든 Subject [S] 자체는 S. S입니다.

Observer 패턴 - S를 관찰하는 사람과 일치하는 주제가 그 자체가 S.이어야하는 관찰 가능한 주제 자체입니다.

2

질문에 대한 답변을드립니다. your answer here 또는 the more interesting answer herehere을 읽으셨습니까? 읽지 않은 목록을 컴파일해야합니다. Coursera에 독서 목록이 있습니까?

+0

내가 한 보세요,하지만 지금은 완전히 새로운 것을 시도하지 않기로했습니다 :) – Zavior

3

건물 브라이언의 대답에 : 나는 그것이 불필요한 별도의 Observer[S] 특성을 가지고 찾아, 단순히 S => Unit은 충분 :

trait Subject[S] { 
    this: S => 
    private var observers: List[S => Unit] = Nil 
    def addObserver(observer: S => Unit) = observers = observer :: observers 

    def notifyObservers() = observers.foreach(_.apply(this)) 
} 

... 

class AccountReporter { 
    def receiveUpdate(account: Account) = 
     println("Observed balance change: "+account.balance) 
} 

... 
observedAccount.addObserver(accountReporter.receiveUpdate _)