关于C#观察者模式
直接贴代码吧,刚刚学C#没多久,不知道算不算是C#的观察者模式。。。各位多多指教啊!将那些错误挖出来。class Subscriber
{
private Subject subject ;
public Subject Subject
{
get { return this.subject; }
set { this.subject = (Subject)value; }
}
public Subscriber()
{
subject = new Subject();
this.Subject.Public +=new Subject.PublicerEventHandler(Subject_Public);
}
//事件处理方法
private void Subject_Public(object sender, EventArgs e)
{
System.Console.WriteLine("订阅者事件被引发!");
}
}
class Publicer
{
public void observer(Object sender ,EventArgs e)
{
System.Console.WriteLine("---------observer start------------");
Subscriber sub = new Subscriber();
sub.Subject.PublicerEvent();
}
}
class Subject
{
public delegate void PublicerEventHandler(object sender , EventArgs e);
public virtual event PublicerEventHandler Public;
//委托的事件处理方法
publicvoid PublicerEvent()
{
if(this.Public != null)
this.Public(this,EventArgs.Empty);
}
} 不熟悉C#
不知delegate类型函数是否是C#内部对Observer的支持?
MS,LZ写的不是Observer..
类写好了,有没有这样的调用:
增加监听者:
publiser.addListener(listener l);
发布事件:
publiser.publish(Event);
另名,觉得命名好像有点混乱。。
publisher有个Observer方法。。
来个java版的:
public class EventGenerator {interface Listener {
void notify(String reason);
}
private Publisher publisher = new Publisher();
/**
* 添加监听器
*
* @param l
*/
public void addEventListener(Listener l) {
publisher.subcribe(l);
}
public void removeEventListener(Listener l) {
publisher.cancelSubcribe(l);
}
/**
* 事件发生
*
* @param reason
*/
public void someEventHappend(final String reason) {
publisher.publish(new Publisher.Distributor() {
@Override
public void deliverTo(Object subcriber) {
((Listener) subcriber).notify(reason);
}
});
}
}
public class Publisher {
interface Distributor {
void deliverTo(Object subcriber);
}
private class Node {
public final Object subcriber;
public Node next;
public Node(Object subcriber, Node next) {
this.subcriber = subcriber;
this.next = next;
}
public Node remove(Object o) {
if (o == subcriber) {
return next;
}
if (next == null) {
throw new NoSuchElementException(o.toString());
}
return new Node(subcriber, next.remove(o));
}
public void accept(Distributor dis) {
dis.deliverTo(subcriber);
}
}
public volatile Node subcribers = null;
public void subcribe(Object subcriber) {
// TODO 订阅
subcribers = new Node(subcriber, subcribers);
}
public void cancelSubcribe(Object subcriber) {
// TODO 取消订阅
subcribers = subcribers.remove(subcriber);
}
public void publish(Distributor distributor) {
for (Node cursor = subcribers; cursor != null; cursor = cursor.next) {
cursor.accept(distributor);
}
}
}
[ 本帖最后由 xinggg22 于 2008-4-25 18:01 编辑 ]
页:
[1]