观察者模式的另一种形式

namespace MyCollections 
{
   
using System.Collections;
   
//-----------------------------------------------------------------------------
   
//该委托定义相当于观察者模式中的 Notify()函数,
   
//用来通知观察者关于subject 的变化
   
//通知观察者,观察者会自动执行观察者内的Update(),Update()方法会暴露给subjects.
   
// A delegate type for hooking up change notifications.
   public delegate void ChangedEventHandler(object sender, EventArgs e);
   
   
//------------------------------------------------------------------------------
   
//该类相当于观察者模式中的subjects.

   
// A class that works just like ArrayList, but sends event
   
// notifications whenever the list changes.
   public class ListWithChangedEvent: ArrayList 
   
{
      
// An event that clients can use to be notified whenever the
      
// elements of the list change.
      public event ChangedEventHandler Changed;     //事件相当于实做Notify()函数

      
// Invoke the Changed event; called whenever list changes
      protected virtual void OnChanged(EventArgs e) 
      
{
         
if (Changed != null)                       //这里表示subjects状态有变化,需要通知observers.
            Changed(this, e);
      }


      
// Override some of the methods that can change the list;
      
// invoke event after each
      public override int Add(object value) 
      
{
         
int i = base.Add(value);
         OnChanged(EventArgs.Empty);
         
return i;
      }


      
public override void Clear() 
      
{
         
base.Clear();
         OnChanged(EventArgs.Empty);
      }


      
public override object this[int index] 
      
{
         
set 
         
{
            
base[index] = value;
            OnChanged(EventArgs.Empty);
         }

      }

   }

}


namespace TestEvents 
{
   
using MyCollections;
   
//侦听者类似于观察者模式中的observers
   class EventListener 
   
{
      
private ListWithChangedEvent List;

      
public EventListener(ListWithChangedEvent list) 
      
{
         List 
= list;
         
// Add "ListChanged" to the Changed event on "List".
         List.Changed += new ChangedEventHandler(ListChanged);      //这里类似于AddObserver(); 
      }


      
// This will be called whenever the list changes.
      private void ListChanged(object sender, EventArgs e) 
      
{
         Console.WriteLine(
"This is called when the event fires."); //这里类似于观察者暴露给subjects 的Update()方法
         Thread.Sleep(5000);
      }


      
public void Detach() 
      
{
         
// Detach the event and delete the list
         List.Changed -= new ChangedEventHandler(ListChanged);      //这里类似于RemoveObserver();
         List = null;
      }

   }


   
class Test 
   
{
      
// Test the ListWithChangedEvent class.
      public static void Main() 
      
{
      
// Create a new list.
      ListWithChangedEvent list = new ListWithChangedEvent();       //创建一个subject(observable)

      
// Create a class that listens to the list's change event.
      EventListener listener = new EventListener(list);             //创建一个观察者

      
// Add and remove items from the list.
      list.Add("item 1");                                           //subject 的状态发生变化,通知观察者作相应的动作 ListChanged()
      list.Clear();                                                 //同上                            
      listener.Detach();                                            //删除观察者
      }

   }

}

转载于:https://www.cnblogs.com/shufan/p/3200898.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值