Macros haxe:如何创建整洁的观察者模式原型
我创建了简单的观察者原型:Macros haxe:如何创建整洁的观察者模式原型,macros,observer-pattern,haxe,Macros,Observer Pattern,Haxe,我创建了简单的观察者原型: class CObservable<T> { public function new() { mObservers = new Array<T>(); } public function sign(aObserver:T):Bool { for (observer in mObservers) if (observer == aObserver)
class CObservable<T> {
public function new() {
mObservers = new Array<T>();
}
public function sign(aObserver:T):Bool {
for (observer in mObservers)
if (observer == aObserver)
return false;
mObservers.push(aObserver);
return true;
}
private var mObservers:Array<T>;
}
然后我用一些具体的类来扩展原型:
class CConcreteObservable extends CObservable<IConcreteObserver> {
public function new() {
super();
}
public function notifyStart():Void {
for (observer in mObservers)
observer.onStart(this);
}
public function notifyStop():Void {
for (observer in mObservers)
observer.onStop(this);
}
// ... more notify methods for every callback ...
// ... more and more ...
// ... and even more ...
}
类CConcreteObservable扩展了CObservable{
公共职能(新增){
超级();
}
公共函数notifyStart():Void{
用于(移动服务器中的观察者)
onStart观察员(本);
}
公共函数notifyStop():Void{
用于(移动服务器中的观察者)
observer.onStop(本);
}
//…每个回调的更多notify方法。。。
//…越来越多。。。
//……甚至更多。。。
}
所有这些复制粘贴对我来说都是不切实际的,尤其是当我有十几种回调方法时。声明一个简单的
notify
方法,或者在原型中可能是宏并调用它们,比如notify(onStart)
,notify(onStop)
等等,有什么巧妙的技巧吗?这里有点不清楚您想要实现什么,但它看起来像是某种奇怪的Java模式,在一种具有一流函数的语言中毫无意义。我建议在Haxe中使用信号。看看or,我试图为每个观察者类使用干净的描述性接口(onStart,onStop…),而不是奇怪的面向函数的回调(sign(eventType,eventListener)——什么是事件类型?什么是侦听器语法?)。因此,当具体的observable类发送一些通知时,它调用实现相应接口的每个观察者的一个重要方法。它有一个很大的缺点,即使您不需要所有事件,您也必须至少在observer类中实现虚拟函数,或者我必须将所有数量的可能事件拆分为一堆不同的接口。当然,我可以创建类似于signStart(listener:ccontreObservable->Void)
,signStop的东西(监听器:CConcreteObservable->Void)
等等,没有任何接口。但是,对于不同监听器引用的内部容器列表,它将产生相同或更严重的复制粘贴问题。没有“事件类型”涉及。我建议您实际阅读我建议的内容。我还想指出,Haxe的枚举充当代数数据类型,因此您可以强制处理程序处理许多不同的通知,例如,enum Message{Start;Stop;}
然后有一个信号
。没有复制粘贴或任何东西。谢谢。这些库看起来正是我需要的。
class CConcreteObservable extends CObservable<IConcreteObserver> {
public function new() {
super();
}
public function notifyStart():Void {
for (observer in mObservers)
observer.onStart(this);
}
public function notifyStop():Void {
for (observer in mObservers)
observer.onStop(this);
}
// ... more notify methods for every callback ...
// ... more and more ...
// ... and even more ...
}