标签: observer-pattern

创建列表更新时触发的事件

我有一个静态类 (DataFormSubject),它包含一个通用 List 对象,如下所示:

private static List<DataForm> dataForms = new List<DataForm>();
Run Code Online (Sandbox Code Playgroud)

当列表更新时,需要告知依赖此列表的其他类,因此我创建了一个自定义事件,以及在添加或删除项目时可以触发的关联方法,如下所示:

    public delegate void DataFormsUpdatedHandler(object sender);
    public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;

    public static void AddDataForm(DataForm df)
    {
        dataForms.Add(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

    public static void RemoveDataForm(DataForm df)
    {
        dataForms.Remove(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }
Run Code Online (Sandbox Code Playgroud)

该列表可通过属性从静态类获取,如下所示:

   public static List<DataForm> DataForms
    {
        get { return dataForms; }
        //set { dataForms = value; }
    }
Run Code Online (Sandbox Code Playgroud)

但这里的问题是,客户端现在可以通过访问属性并在类上直接添加或删除来绕过更新事件!例如

     DataFormSubject.DataForms.Add(new DataForm);
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止这种情况,或者有更好的方法来实现我想要的?理想情况下,我想要的是观察者可以订阅的 List 类上的更新事件!

c# list observer-pattern

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

如果对象是垃圾回收,如何获得通知?

精简版:

对于缓存类,如果对象被垃圾收集(从我的缓存中删除相应的条目),我需要得到通知.这样做的最佳方法是什么?从析构函数发送事件?

长版:

我正在编写一个cacher/memoizer,用于获取一个巨大的参数树对象和许多小值类型参数的函数,例如,

double myFunc(HugeParTree parTree, int dynPar1, double dynPar2)
Run Code Online (Sandbox Code Playgroud)

我想以下列方式缓存这些函数:

  • 缓存元组的结果(parTree.GUID,dynPar1,dynPar2,...)
  • 每当parTree很少发生变化时,所有相应的缓存条目都将被删除(通过Observer模式).(parTree.Equals()太贵了;它比较了100多种价值类型).

代码现在看起来像这样(对于一个值参数):

public class CachedFunction1ObsPar1Par<TRet, TObsPar1, TPar1>
        where TObsPar1 : IObservable, IProvideGUID
    {
        public delegate TRet ValueCalculator(TObsPar1 obsPar1, TPar1 par1);

        public CachedFunction1ObsPar1Par(ValueCalculator calc)
        {
            _calc = calc;
        }


        #region members

        private ValueCalculator _calc;

        private Dictionary<Guid, Dictionary<TPar1, TRet>> _cache = 
            new Dictionary<Guid, Dictionary<TPar1,TRet>>();

        #endregion


        public TRet value(TObsPar1 obsPar1, TPar1 par1)
        {
            TRet result;
            bool cacheHit = checkCache(obsPar1, par1, out result);

            if (cacheHit)
            {
                Debug.Assert(result.Equals(_calc(obsPar1, …
Run Code Online (Sandbox Code Playgroud)

.net c# caching garbage-collection observer-pattern

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

在Rspec中测试时如何跳过观察者的after_save调用?

在PostObserver中的after_save方法中有一些对外部服务的API调用.但我不想在使用Rspec进行测试时调用after_save.有没有办法做到这一点?谢谢.

这是Rails 3.1

rspec observer-pattern ruby-on-rails-3

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

执行函数时,jQuery/Javascript会收到通知

var f = function() {
    // Do something useful here
};
Run Code Online (Sandbox Code Playgroud)

有没有办法'观察'这个功能,并在执行时得到通知?类似于jQuery中绑定的东西,但我想绑定函数而不是dom事件?

不想要这样的东西:

var f = function() {
    // Do something useful here
    notifyObserver();
};
Run Code Online (Sandbox Code Playgroud)

但是我想要这样的东西:

f.bind(function() {
    alert('F was executed.');
});
Run Code Online (Sandbox Code Playgroud)

javascript jquery bind notify observer-pattern

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

如何检查Rails控制台中启用的观察者

我在不同的环境中启用了不同的观察者,我希望能够通过控制台检查哪些是启用的

就像是

ActiveRecord::Observers.list
Run Code Online (Sandbox Code Playgroud)

console ruby-on-rails observers observer-pattern

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

Java Swing和观察者模式

我正在寻找一种在Swing中清晰地组织我的UI代码的方法.

假设我的UI代码按以下方式构建:

class MainWindow extends JFrame {
    // SomePanel panel is added here
}
class SomePanel extends JPanel {
    // buttons, checkboxes and so on are added here
}
Run Code Online (Sandbox Code Playgroud)

假设我在main方法中实例化一个MainWindow对象:

MainWindow frame = new MainWindow("I am an App");
Run Code Online (Sandbox Code Playgroud)

在main-method中监听按钮的ActionEvents(在SomePanel中声明,在MainWindow中声明)的最佳做法是什么?

非常感谢您的帮助!

java oop model-view-controller swing observer-pattern

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

Google Tag Manager 使用什么模式来观察 de `dataLayer` 数组?

我观察了dataLayer数组,但没有看到push. 实际上根本没有自定义方法。GTM 如何观察数组的变化?据我所知,对 an 的更改Array不会引发任何事件,是吗?


编辑:

我做了一些更多的研究,发现谷歌的库与以下交互dataLayerhttps : //github.com/google/data-layer-helper#listening-for-messages
我会看看代码,甚至可能回答我自己的问我是否了解内部运作。

javascript arrays key-value-observing observer-pattern google-tag-manager

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

如何在数据绑定库中获得通知?

嗨,我的问题是我的活动侦听viewmodel字段更改但未调用回调!

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    binding.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable observable, int i) {
            Log.d(getClass().getSimpleName(), "changed");
        }
    });
    User user = new User("user");
    binding.setUser(user);
    user.setName("newUser");
    }

}
Run Code Online (Sandbox Code Playgroud)

和我的视图模型:

public class User extends BaseObservable {

    public String name;

    public User(String name) {
        this.name = name;
    }

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    } …
Run Code Online (Sandbox Code Playgroud)

android observer-pattern android-databinding

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

为什么我们要指定一个委托和一个事件,为什么不在C#中使用一个事件呢?

为什么我们在事件中指定一个委托,为什么不在C#中使用事件呢?

例如,我有以下代码:

class Shop
{
    internal delegate void _EventHandler(object sender, GoodsInfoEventArgs e);
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么开发C#的人不会通过以下方式实现事件:

class Shop
{
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的意思是没有代表.

我知道事件在C#中是如何工作的.它将只调用所有已订阅的代理,如果有的话,它将等于null.而且我也知道事件和代表之间的区别.该事件仅允许添加或减少委托,但不允许更改指针(我们可以对事件执行+=-=操作,但我们不能=对事件执行操作),而委托允许执行所有加法,减法和赋值操作.因此,事件是委托的包装器,包装器允许控制委托可以改变的方式.

所有这一切,我不明白其背后的原因需要在我们定义事件的程序中的每个地方都定义一个委托.

如果你不理解我的问题的一部分,请问我这个问题,我会提供更多信息.

谢谢.

我很抱歉混淆.我的意思是,为什么不使用这样的东西:

internal event _EventHandler(object sender, GoodsInfoEventArgs e) GoodsArrived;
Run Code Online (Sandbox Code Playgroud)

c# syntax events delegates observer-pattern

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

如何在类的 __init__ 变量更改时检测和触发功能

我希望能够监视变量并在更改类的实例时调用类中的函数。

class Example:
    def __init__(self, content):
        self.content = content

example1 = Example('testing')

example1.content = 'testing123'
Run Code Online (Sandbox Code Playgroud)

我希望能够检查是否example1.content已更改/更新,如果已更改,请运行一些代码。

python class observer-pattern

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