工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1886|回复: 3

关于C#观察者模式

[复制链接]
发表于 2008-4-25 16:49 | 显示全部楼层 |阅读模式
直接贴代码吧,刚刚学C#没多久,不知道算不算是C#的观察者模式。。。各位多多指教啊!
    将那些错误挖出来。
  1. class Subscriber
  2.     {

  3.         private Subject subject ;

  4.         public Subject Subject
  5.         {
  6.             get { return this.subject; }
  7.             set { this.subject = (Subject)value; }
  8.         }

  9.         public Subscriber()
  10.         {
  11.             subject = new Subject();
  12.             this.Subject.Public +=new Subject.PublicerEventHandler(Subject_Public);
  13.         }

  14.         //事件处理方法
  15.         private void Subject_Public(object sender, EventArgs e)
  16.         {
  17.             System.Console.WriteLine("订阅者事件被引发!");        
  18.         }

  19.     }
复制代码

  1. class Publicer
  2.     {
  3.         public void observer(Object sender ,EventArgs e)
  4.         {
  5.             System.Console.WriteLine("---------observer start------------");
  6.             Subscriber sub = new Subscriber();
  7.             sub.Subject.PublicerEvent();      
  8.         }
  9.     }
复制代码


  1. class Subject
  2.     {

  3.         public delegate void PublicerEventHandler(object sender , EventArgs e);

  4.         public virtual event PublicerEventHandler Public;

  5.         //委托的事件处理方法
  6.         public  void PublicerEvent()
  7.         {
  8.             if(this.Public != null)
  9.                 this.Public(this,EventArgs.Empty);
  10.         }
  11.     }
复制代码
发表于 2008-4-25 17:07 | 显示全部楼层
不熟悉C#
不知delegate类型函数是否是C#内部对Observer的支持?


MS,LZ写的不是Observer..

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


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

使用道具 举报

 楼主| 发表于 2008-4-25 17:57 | 显示全部楼层

来个java版的:

  1. public class EventGenerator {

  2.     interface Listener {
  3.         void notify(String reason);
  4.     }

  5.     private Publisher publisher = new Publisher();

  6.     /**
  7.      * 添加监听器
  8.      *
  9.      * @param l
  10.      */
  11.     public void addEventListener(Listener l) {
  12.         publisher.subcribe(l);
  13.     }

  14.     public void removeEventListener(Listener l) {
  15.         publisher.cancelSubcribe(l);
  16.     }

  17.     /**
  18.      * 事件发生
  19.      *
  20.      * @param reason
  21.      */
  22.     public void someEventHappend(final String reason) {
  23.         publisher.publish(new Publisher.Distributor() {
  24.             @Override
  25.             public void deliverTo(Object subcriber) {
  26.                 ((Listener) subcriber).notify(reason);
  27.             }
  28.         });
  29.     }
  30. }
复制代码

  1. public class Publisher {

  2.     interface Distributor {
  3.         void deliverTo(Object subcriber);
  4.     }

  5.     private class Node {
  6.         public final Object subcriber;
  7.         public Node next;

  8.         public Node(Object subcriber, Node next) {
  9.             this.subcriber = subcriber;
  10.             this.next = next;
  11.         }

  12.         public Node remove(Object o) {
  13.             if (o == subcriber) {
  14.                 return next;
  15.             }
  16.             if (next == null) {
  17.                 throw new NoSuchElementException(o.toString());
  18.             }
  19.             return new Node(subcriber, next.remove(o));
  20.         }

  21.         public void accept(Distributor dis) {
  22.             dis.deliverTo(subcriber);
  23.         }
  24.     }

  25.     public volatile Node subcribers = null;

  26.     public void subcribe(Object subcriber) {
  27.         // TODO 订阅
  28.         subcribers = new Node(subcriber, subcribers);
  29.     }

  30.     public void cancelSubcribe(Object subcriber) {
  31.         // TODO 取消订阅
  32.         subcribers = subcribers.remove(subcriber);
  33.     }

  34.     public void publish(Distributor distributor) {
  35.         for (Node cursor = subcribers; cursor != null; cursor = cursor.next) {
  36.             cursor.accept(distributor);
  37.         }
  38.     }
  39. }
复制代码

[ 本帖最后由 xinggg22 于 2008-4-25 18:01 编辑 ]
回复

使用道具 举报

头像被屏蔽
发表于 2008-5-3 09:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 18:31

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表