xinggg22 发表于 2008-4-25 16:49

关于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);
      }
    }

dreamwalker 发表于 2008-4-25 17:07

不熟悉C#
不知delegate类型函数是否是C#内部对Observer的支持?


MS,LZ写的不是Observer..

类写好了,有没有这样的调用:
增加监听者:
publiser.addListener(listener l);
发布事件:
publiser.publish(Event);


另名,觉得命名好像有点混乱。。
publisher有个Observer方法。。

xinggg22 发表于 2008-4-25 17:57

来个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 编辑 ]

china-coffeee 发表于 2008-5-3 09:43

页: [1]
查看完整版本: 关于C#观察者模式