2016-11-24 8 views
0

Rubyでオブザーバーパターンを使用するために、以下の例を実装しました。私はthisに従ってみましたが、うまくいきませんでした。Rubyでオブザーバーパターンが機能しない

require "observer" 

class AAnyClass 
    extend Observable 
    changed 
    notify_observers self 
end 

module AnObserver 

    extend self 

    def update constant 
    p "Constant #{constant} has been called." 
    end 

    def observe constant 
    constant.add_observer(self) 
    end 

end 

AnObserver.observe AAnyClass 
# must return "Constant AAnyClass has been called." 
AAnyClass 
# must return "Constant AAnyClass has been called." 
AAnyClass 

UPDATE私はこのように、クラスにモジュールAnObserver変換

class AnObserver 

    def update constant 
    $stdout.puts "Constant #{constant} has been called." 
    end 

end 

およびコンストラクタにObservableメソッドを追加としてAnObserverインスタンスを渡すクラスAAnyClassを変更しますパラメータadd_observerへのパラメータ:

class AAnyClass 
    include Observable 

    def initialize 
    add_observer AnObserver.new 
    changed 
    notify_observers AAnyClass 
    end 

end 

最後に、eigenclassAAnyClassAAnyClass’sコンストラクタの同じコードで変更する小さなコードを追加しました。

class << AAnyClass 
    extend Observable 

    add_observer AnObserver.new 
    changed 
    notify_observers AAnyClass 
end 
AAnyClass 

AAnyClass.new 
AAnyClass.new 

これだけです。

+1

あなたのコードは、解析段階(クラスが宣言されているとき)で 'notify_observers'を一度呼びます。パターンは動作しない/動作しません。コードはできます。 – mudasobwa

+0

「AAnyClass」が呼ばれたことを知るための方法がいくつかありますか? '' Module'''の '' included''メソッドの使い方。 – rplaurindo

答えて

1

私はあなたがモジュールを使用していると思うし、クラスと "インクルード"を使用する必要があります "拡張"だと思います。

require "observer" 

class AAnyClass 
    include Observable 

    def run 
    changed 
    notify_observers(self) 
    end 
end 

class AnObserver 

    def initialize(ob) 
    ob.add_observer(self) 
    end 

    def update constant 
    p "Constant #{constant} has been called." 
    end 

    def observe constant 
    constant.add_observer(constant) 
    end 

end 

ob = AAnyClass.new 
AnObserver.new ob 
ob.run 
+0

私はポストにアップデートを追加しました。しかし、私はあなたがしたことに基づいています。 – rplaurindo

関連する問題