标签: observer-pattern

观察者模式中的正确通知程序

我想实现一个Model类的Observer,它不会改变Model.因此,它应该能够使用const-Reference来访问Model.但注册观察员禁止这样做.

以下是我的项目中如何实现观察者模式:



//Attributes of type Observable are used by classes that want to notify others
//of state changes. Observing Objects register themselves with AddObserver.
//The Observable Object calls NotifyObservers when necessary.
class Notifier
{
public:
    AddObserver(Observer*);
    RemoveObserver(Observer*);
    NotifyObservers();
};

class Model
{
public:
    Notifier& GetNotifier() //Is non const because it needs to return a non-const 
    {                       //reference to allow Observers to register themselves.

         return m_Notifier; 
    }

    int QueryState() const;

    void ChangeModel(int newState)
    {
        m_Notifier.NotifyObservers();
    }

private:
    Notifier m_Notifier;
};

//This …
Run Code Online (Sandbox Code Playgroud)

c++ const const-correctness observer-pattern

2
推荐指数
1
解决办法
949
查看次数

Java观察者和可观察者

任何人都可以解释为什么我点击这个JFrame上的按钮时没有调用printobserver上的更新方法?

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


/**
 * 
 */

/**
 * @author james
 *
 */
public class Driver extends JFrame {


    /**
     * @param title
     */
    public Driver() {
        super("click me");

        setSize(400, 400);
        //set up observer

        final ButtonObservable gw = new ButtonObservable();
        Observer o1 = new PrintObserver();
        gw.addObserver(o1);

        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(Frame.MAXIMIZED_BOTH);
        JPanel panel = new JPanel(); …
Run Code Online (Sandbox Code Playgroud)

java design-patterns observer-pattern

2
推荐指数
2
解决办法
3088
查看次数

onClick Vs Observer

我想知道为什么最好使用观察者而不是直接将动作添加到onclick =""中.

例如.

$('mybutton').observe('click', respondToClick);

vs

<a href="#" onclic="respondToClick()">button</a>
Run Code Online (Sandbox Code Playgroud)

谢谢

javascript jquery onclick prototypejs observer-pattern

2
推荐指数
1
解决办法
1100
查看次数

在magento中创建新发票时,事件名称是什么?

在管理面板中创建发票时,观察者的该事件的名称是什么?我已经尝试了*sales_order_invoice_register*和*sales_order_invoice_pay*但它不起作用.

invoice magento observer-pattern

2
推荐指数
1
解决办法
6107
查看次数

Ruby:在事件触发器中自动包装方法

继承人我拥有/想要的东西:

module Observable
  def observers; @observers; end

  def trigger(event, *args)
    good = true
    return good unless (@observers ||= {})[event]
    @obersvers[event].each { |e| good = false and break unless e.call(self, args) }
    good
  end

  def on(event, &block)
    @obersvers ||= {}
    @obersvers[event] ||= []
    @observers[event] << block
  end

end

class Item < Thing
  include Observable
  def pickup(pickuper)
    return unless trigger(:before_pick_up, pickuper)

    pickuper.add_to_pocket self

    trigger(:after_pick_up, pickuper)
  end

  def drop(droper)
    return unless trigger(:before_drop, droper)

    droper.remove_from_pocket self

    trigger(:after_drop, droper)
  end

  # Lots of other methods …
Run Code Online (Sandbox Code Playgroud)

ruby events metaprogramming observer-pattern

2
推荐指数
1
解决办法
1653
查看次数

ExtJS 4获取可观察对象的每个侦听器

我有一个可观察对象,定义如下:

Ext.define ('MyObject', {
  mixins: {
    observable: 'Ext.util.Observable'
  } ,
  constructor: function (cfg) {
    this.initConfig (cfg);
    this.mixins.observable.constructor.call (this, cfg);
    ...
  }
});
Run Code Online (Sandbox Code Playgroud)

然后,我创建了这个对象的实例并附加了一些监听器:

var obj = Ext.create ('MyObject', {...});
obj.on ({
  first: function () {...} ,
  second: function () {...} ,
  third: function () {...} ,
  fourth: function () {...}
});
Run Code Online (Sandbox Code Playgroud)

最后,我要破坏'obj'实例,但此时我要保存以前附加的每个听众,因为我很生气,我需要创建另一个'MyObject'实例,具有相同的配置'obj',听众包括在内.

所以,问题是:如何保存可观察对象的每个侦听器?

非常感谢!

javascript listeners extjs observable observer-pattern

2
推荐指数
1
解决办法
4644
查看次数

设计模式 - 向特定观察者发送通知

在我的应用程序中,有许多观察者和一个主题,但我想向特定观察者发送关于变量的一些变化的通知.

我很困惑,我也在互联网上搜索它..但是没有太多.

如果早些时候被问过我很抱歉...现在我无法找到一些简明的答案.

java design-patterns observer-pattern

2
推荐指数
1
解决办法
2707
查看次数

读取可观察的TAP模式

经过对StackOverflow的大量努力和研究 - 其中大部分已经过时,因为Reactive Extensions代码最近发生了变化 - 我终于能够消除此Observable方法从套接字读取数据的所有编译错误,我理解这一点代码比我最初做的要好得多.但还不完全.有人可以用英语回复给我,回答两三个问题吗?

是从这种方法中提取的缓冲数据(或者如果我有错误,应该怎么做?)?是否有不再需要它的部分?虽然我真的喜欢与业务代码分离,并且只用一两种方法保留所有套接字代码,但有没有更好的方法(解耦和可读)?

    public static IObservable<int> WhenDataReceived(this Socket socket, int byteCount, SocketFlags flags = SocketFlags.None)
    {
        Contract.Requires(byteCount > 0);

        return Observable.Create<int>(
            observer =>
            {
                byte[] buffer = new byte[byteCount];
                int remainder = byteCount;
                bool shutdown = false;

                return Observable.Defer<int>(() =>
                        Task.Factory.FromAsync<int>(socket.BeginReceive(buffer, buffer.Length - remainder, remainder, flags,
                        (result) =>
                        {
                            var read = (int)result.AsyncState;
                            remainder -= read;

                            if (read == 0)
                                shutdown = true;
                        },
                        null), socket.EndReceive).ToObservable())
                    .TakeWhile(_ => remainder > 0 && !shutdown)
                    .TakeLast(1)
                    .Subscribe(
                        observer.OnNext, …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive observer-pattern c#-5.0

2
推荐指数
1
解决办法
502
查看次数

ContentObserver for SQLite数据库Android

我有一个带有SQLite数据库的Android应用程序,我想知道如何创建和注册ContentObserver将通知数据库更改的通知.我知道我可以使用a来做这个ContentProvider,但是我只使用我的应用程序的数据库,所以没有必要把它变成一个ContentProvider,我想知道是否有办法避免这种情况.

谢谢!

sqlite android observer-pattern contentobserver

2
推荐指数
1
解决办法
3597
查看次数

在C++中创建观察者设计模式的好方法

我试图在C++中实现观察者设计模式,如下所示

#include <iostream>
#include <vector>

using namespace std;

class observer
{
    public:
        observer() = default;
        ~observer() = default;

        virtual void notify() = 0;
};

class subject
{
    vector <observer *> vec;

    public:
        subject() = default;
        ~subject() = default;

        void _register(observer *obj)
        {
            vec.push_back(obj);
        }

        void unregister(observer *obj)
        {
            int i;
            for(i = 0; i < vec.size(); i++)
            {
                if(vec[i] == obj)
                {
                    cout << "found elem. unregistering" << endl;
                    vec.erase(vec.begin() + i);
                    break;
                }
            }

            if(i == vec.size())
            {
                cout …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns observer-pattern

2
推荐指数
1
解决办法
603
查看次数