我想实现一个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) 任何人都可以解释为什么我点击这个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) 我想知道为什么最好使用观察者而不是直接将动作添加到onclick =""中.
例如.
$('mybutton').observe('click', respondToClick);
vs
<a href="#" onclic="respondToClick()">button</a>
Run Code Online (Sandbox Code Playgroud)
谢谢
在管理面板中创建发票时,观察者的该事件的名称是什么?我已经尝试了*sales_order_invoice_register*和*sales_order_invoice_pay*但它不起作用.
继承人我拥有/想要的东西:
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) 我有一个可观察对象,定义如下:
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',听众包括在内.
所以,问题是:如何保存可观察对象的每个侦听器?
非常感谢!
在我的应用程序中,有许多观察者和一个主题,但我想向特定观察者发送关于变量的一些变化的通知.
我很困惑,我也在互联网上搜索它..但是没有太多.
如果早些时候被问过我很抱歉...现在我无法找到一些简明的答案.
经过对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) 我有一个带有SQLite数据库的Android应用程序,我想知道如何创建和注册ContentObserver将通知数据库更改的通知.我知道我可以使用a来做这个ContentProvider,但是我只使用我的应用程序的数据库,所以没有必要把它变成一个ContentProvider,我想知道是否有办法避免这种情况.
谢谢!
我试图在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) observer-pattern ×10
c++ ×2
java ×2
javascript ×2
android ×1
c# ×1
c#-5.0 ×1
const ×1
events ×1
extjs ×1
invoice ×1
jquery ×1
listeners ×1
magento ×1
observable ×1
onclick ×1
prototypejs ×1
ruby ×1
sqlite ×1