的java.util.Observer和java.util.Observable丑陋的.它们需要使类型安全风扇不舒服的类型的演员表,并且你不能将一个类定义Observer为多个事物而没有丑陋的演员阵容.事实上,在" 我如何知道Observer类在Java中发送的通用对象? "中,应答者说每个观察者/可观察者中只应使用一种类型的数据.
我正在尝试在Java中创建一个通用版本的观察者模式来解决这两个问题.它与之前提到的帖子没有什么不同,但这个问题没有明显解决(最后一个评论是来自OP的未回答的问题).
我Transformations.switchMap在我的ViewModel中使用,因此LiveData在我的片段中观察到的我的集合会对code参数的变化做出反应.
这非常有效:
public class MyViewModel extends AndroidViewModel {
private final LiveData<DayPrices> dayPrices;
private final MutableLiveData<String> code = new MutableLiveData<>();
// private final MutableLiveData<Integer> nbDays = new MutableLiveData<>();
private final DBManager dbManager;
public MyViewModel(Application application) {
super(application);
dbManager = new DBManager(application.getApplicationContext());
dayPrices = Transformations.switchMap(
code,
value -> dbManager.getDayPriceData(value/*, nbDays*/)
);
}
public LiveData<DayPrices> getDayPrices() {
return dayPrices;
}
public void setCode(String code) {
this.code.setValue(code);
}
/*public void setNbDays(int nbDays) {
this.nbDays.setValue(nbDays);
}*/
}
public class …Run Code Online (Sandbox Code Playgroud) android observer-pattern android-livedata android-viewmodel android-architecture-components
收听文件夹或文件以查看是否已保存或是否添加了新文件的最佳方法是什么?
我们最近开始在我们公司进行合规性推动,并且需要保留我们目前在Rails应用程序中管理的数据的完整历史记录.我们已经可以将每个操作的描述性内容简单地推送到日志文件中,这是一种相当不引人注目的方式.
我倾向于做这样的事情ApplicationController:
around_filter :set_logger_username
def set_logger_username
Thread.current["username"] = current_user.login || "guest"
yield
Thread.current["username"] = nil
end
Run Code Online (Sandbox Code Playgroud)
然后创建一个看起来像这样的观察者:
class AuditObserver < ActiveRecord::Observer
observe ... #all models that need to be observed
def after_create(auditable)
AUDIT_LOG.info "[#{username}][ADD][#{auditable.class.name}][#{auditable.id}]:#{auditable.inspect}"
end
def before_update(auditable)
AUDIT_LOG.info "[#{username}][MOD][#{auditable.class.name}][#{auditable.id}]:#{auditable.changed.inspect}"
end
def before_destroy(auditable)
AUDIT_LOG.info "[#{username}][DEL][#{auditable.class.name}][#{auditable.id}]:#{auditable.inspect}"
end
def username
(Thread.current['username'] || "UNKNOWN").ljust(30)
end
end
Run Code Online (Sandbox Code Playgroud)
并且通常这很有用,但是当使用<association>_ids加入has_many:through =>关联的"魔法" 方法时它会失败.
例如:
# model
class MyModel
has_many :runway_models, :dependent => :destroy
has_many :runways, :through => :runway_models
end
#controller
class MyModelController …Run Code Online (Sandbox Code Playgroud) 我目前正在上一堂关于设计模式的课程,并想知道是否EventListener是一个Observable?
我之间并没有真正看到它们之间的区别,因为它们都有一个订阅者列表,并在发生变化时通知这些订阅者.
该标准PHP库包括哪些资源调用观察者模式的参考实现,通过的方式SplSubject和SplObserver课程.对于我的生活,我无法弄清楚这些是如何非常有用的,无法将实际事件或任何其他信息与通知一起传递:
class MySubject implements SplSubject {
protected $_observers = [];
public function attach(SplObserver $observer) {
$id = spl_object_hash($observer);
$this->_observers[$id] = $observer;
}
public function detach(SplObserver $observer) {
$id = spl_object_hash($observer);
if (isset($this->_observers[$id])) {
unset($this->_observers[$id]);
}
}
public function notify() {
foreach ($this->_observers as $observer) {
$observer->update($this);
}
}
}
class MyObserver implements SplObserver {
public function update(SplSubject $subject) {
// something happened with $subject, but what
// was it???
}
}
$subject = new …Run Code Online (Sandbox Code Playgroud) 我想在发生陷阱时向任何订户通知警报消息.
我通过委托方法(myDelegate del)制作的代码很好.
我的问题是......
我想知道是否值得使用Eventhandler更好的代理?在我的情况下,不确定委托和事件之间的区别是什么?
通知(trapinfo t),这就是我在这里所做的,以获取陷阱信息.但似乎不是一个好主意.阅读一些介绍传递委托对象的在线教程课程,是否适合我的情况?我该怎么办?有什么建议?
非常感谢 :)
我的代码:
public class trapinfo
{
public string info;
public string ip;
public string cause;
}
public class trap
{
public delegate void myDelegate(trapinfo t);
public myDelegate del;
trapinfo info = new trapinfo();
public void run()
{
//While(true)
// If a trap occurred, notify the subscriber
for (; ; )
{
Thread.Sleep(500);
foreach (myDelegate d in del.GetInvocationList())
{
info.cause = "Shut Down";
info.ip = "192.168.0.1";
info.info = "Test";
d.Invoke(info);
}
}
} …Run Code Online (Sandbox Code Playgroud) 有没有更好的方法在java集合上拥有一个监听器,而不是将它包装在一个实现观察者模式的类中?
我是从C#世界来到Java的,其中Observer模式被实现为带有event关键字的一流语言结构.
我看到Java Observable从早期开始就有这个类,但它显然存在实现问题,似乎没有被广泛使用.到目前为止,我刚刚在我的Java代码中滚动了我自己的Observer模式实现,但我总是忍不住认为必须有一个更好的替代方案来总是输出这个样板代码.Swing中有Listener类,但它们似乎不适合非Swing代码.
对于这个常见问题,推荐的解决方案是什么?第三方库对我来说没问题.
据我了解,观察者模式允许多个观察者监视单个主题.是否存在相反情况的模式?是否存在监视多个主题的单个观察者的模式,并且当其中任何一个主体引发Notify事件时会响应?
observer-pattern ×10
java ×3
observable ×2
activerecord ×1
android ×1
android-architecture-components ×1
c# ×1
cocoa ×1
collections ×1
delegates ×1
events ×1
generics ×1
listener ×1
objective-c ×1
oop ×1
php ×1
ruby ×1
spl ×1