学习的点点滴滴

Email : 107311278@qq.com
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

观察者模式

Posted on 2014-01-15 01:02  v薛定谔的猫v  阅读(204)  评论(0)    收藏  举报

说明:

观察者模式是软件设计的一种模式,也叫做发布/订阅模式。日常生活中基本上都有用到它。比如使用MSN当你的一个好友上线时,你就会收到上线通知;开心网当某个人转帖后,他的好友就都可以收到这个转帖,等等。也就是说一个目标管理所有依赖于它的观察者对象,当它本身状态发生变化时主动发出通知。

 类图:

代码:

/*业务需求:在审批流程的时候客户提交审批单或者审批按钮会发送同时邮件和短信*/
/*此业务需求可以利用观察者设计模式构建*/

public delegate bool EventObserverHandler<TEventArgs>(TEventArgs e);
/// <summary>
/// 注册事件源
/// </summary>
public class ObserverEventArgs<T> : EventArgs where T : class
{
  private T _t;
  public T T1 {  

    get {
                return _t;
            }
            set {
                this._t = value;
            }

   }
  public ObserverEventArgs(T t)
  {
    _t = t;
  }
}
public abstract class BaseObserver<T> where T : class
{
  private EventObserverHandler<ObserverEventArgs<T>> Observered;
  public event EventObserverHandler<ObserverEventArgs<T>> OnObserveredEvent
  {
    add
    {
      EventObserverHandler<ObserverEventArgs<T>> handler2;
      EventObserverHandler<ObserverEventArgs<T>> fieldsChanged = this.Observered;
      do
      {
        handler2 = fieldsChanged;
        EventObserverHandler<ObserverEventArgs<T>> handler3 = (EventObserverHandler<ObserverEventArgs<T>>)
          Delegate.Combine(handler2, value);
        fieldsChanged = Interlocked.CompareExchange<EventObserverHandler<ObserverEventArgs<T>>>
          (ref this.Observered, handler3, handler2);
      }
      while (fieldsChanged != handler2);
    }
    remove
    {
      EventObserverHandler<ObserverEventArgs<T>> handler2;
      EventObserverHandler<ObserverEventArgs<T>> fieldsChanged = this.Observered;
      do
      {
        handler2 = fieldsChanged;
        EventObserverHandler<ObserverEventArgs<T>> handler3 = (EventObserverHandler<ObserverEventArgs<T>>)
          Delegate.Remove(handler2, value);
        fieldsChanged = Interlocked.CompareExchange<EventObserverHandler<ObserverEventArgs<T>>>
          (ref this.Observered, handler3, handler2);
      }
      while (fieldsChanged != handler2);
    }
}
public void AddObserver(EventObserverHandler<ObserverEventArgs<T>> _event)
{
  OnObserveredEvent += _event;
}
public void RemoveObserver(EventObserverHandler<ObserverEventArgs<T>> _event)
{
  OnObserveredEvent -= _event;
}
public bool Notify(ObserverEventArgs<T> t)
{
    if (Observered != null)
                 return Observered(t);
   
           return false;
           
}
}
/// <summary>
/// 实体表 执行监听
/// </summary>
public class Task : BaseObserver<Task>
{
  private string m_state;
  public int ID { get; set; }
  public string Name { get; set; }
  public string State
  {
    get
    {
      return m_state;
    }
    set
    {
      m_state = value;
      Notify(new ObserverEventArgs<Task>(this));
    }
  }
}

/*创建观察者用于发送短信*/    

public class ObserverSms    

{        

  /// <summary>        

  /// 异步发送短信        

  /// </summary>        

   /// <param name="model"></param>        

  /// <returns></returns>        

  public bool AsyncSendSms(ObserverEventArgs<Task> model)        

   {            

    Func<ObserverEventArgs<Task>, bool> fn = SendSms;            

    return fn.EndInvoke(fn.BeginInvoke(model, null, fn));        

  }        

  /// <summary>        

  /// 构建        

  /// </summary>        

   /// <param name="model"></param>        

   /// <returns></returns>        

  private bool SendSms(ObserverEventArgs<Task> model)        

  {            

    #region 发送短信            

    Console.WriteLine("发送短信");            

    #endregion            

    return true;        

  }

  }    

/*创建观察者用于发送邮件*/    

public class ObserverEmail    

{        

  /// <summary>        

   /// 异步发送邮件        

   /// </summary>        

   /// <param name="model"></param>        

  /// <returns></returns>        

  public bool AsyncSendEmail(ObserverEventArgs<Task> model)        

   {            

    Func<ObserverEventArgs<Task>, bool> fn = SendEmail;            

    return fn.EndInvoke(fn.BeginInvoke(model, null, fn));

        }        

  private bool SendEmail(ObserverEventArgs<Task> model)        

  {            

    #region 发送邮件代码            

     Console.WriteLine("发送邮件");            

    #endregion            

    return true;        

  }    

}

class Program    

{        

  static void Main(string[] args)        

  {            

    Task task = new Task();            

     //创建发送短信观察者            

    ObserverSms observer = new ObserverSms();            

       task.AddObserver(new EventObserverHandler<ObserverEventArgs<Task>>(observer.AsyncSendSms));            

    //创建发送邮件观察者            

    ObserverEmail Email = new ObserverEmail();            

    task.AddObserver(new EventObserverHandler<ObserverEventArgs<Task>>(Email.AsyncSendEmail));

            #region 数据库修改改变状态 这里直接赋值代替            

    task.ID = 1;            

    task.Name = "2";            

    task.State = "完成";            

    #endregion

        }    

}