Observerパターンの勉強をしているのですが、言語的なこだわりはあまりないので練習がてら、最近始めたGoで書いてみようと思いました。
PHPで解説されたこのページのコードをGoに書き直そうとしているのですが、うまくいきません。
上記のコードの最初の「実装コード」の部分です。
簡単のために、idやtimeなど一部省略したり、具象クラスもGirlFriendのみにしています。
Go
1package main 2 3import "fmt" 4 5// ======================= 6// 抽象クラス Subject 7// ======================= 8 9type Subject struct { 10 observers []Observer 11} 12 13func NewSubject() *Subject { 14 return &Subject{observers: []Observer{}} 15} 16 17func (self *Subject) registerObser(observer Observer) { 18 self.observers = append(self.observers, observer) 19} 20 21// func removeObserver 22 23// func (self *Subject) notify() {} 24 25// ======================= 26// 具象クラス SMS extends Subject 27// ======================= 28 29type SMS struct { 30 *Subject 31} 32 33func NewSMS() *SMS { 34 return &SMS{Subject: NewSubject()} 35} 36 37func (self *SMS) notifyObservers() { 38 for _, observer := range self.observers { 39 observer.notify() 40 } 41} 42 43func (self *SMS) iAmHome() { 44 self.notifyObservers() 45} 46 47// ======================= 48// 抽象クラス Observer 49// ======================= 50 51type IObserver interface { 52 notify() 53} 54 55type Observer struct { 56 id int 57 subject SMS 58 IObserver 59} 60 61// constructor 62func NewObserver(id int, subject SMS) *Observer { 63 // subject.registerObser() 64 return &Observer{id: id, subject: subject} 65} 66 67// ======================= 68// 具象クラス GirlFriend,Mum extends Observer 69// ======================= 70 71type GirlFriend struct { 72 *Observer 73} 74 75func NewGirlFriend(id int, subject SMS) *GirlFriend { 76 return &GirlFriend{Observer: NewObserver(id, subject)} 77} 78 79func (self *GirlFriend) notify(time string) { 80 fmt.Printf("今帰ったよ %v", time) 81} 82 83// ======================= 84// main 85// ======================= 86 87func main() { 88 89 sms := NewSMS() 90 NewGirlFriend(2, *sms) 91 92 sms.iAmHome() 93} 94
Goはオブジェクト指向の言語ではない(?)ので、上のコードはGoらしくないコードになっているかと思います。
私が知りたいのは、上のコードを動かす書き方と、上記のサイトの内容を同じ程度の柔軟性をもったGoの書き方です。
オブジェクト指向もObserverパターンもGo言語自体も詳しく知らない状態です。
ツッコミどころは沢山あるかと思いますが、どなたかご存知の方がいらっしゃればご教示願えませんでしょうか。
よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。