您的位置毕业设计论文网 , 信息管理系统毕业设计,智轩软件源码网>Android>.NET>观察者模式与c#中的事件与委托>

观察者模式与c#中的事件与委托

发布时间:2013-3-15浏览:

核心提示:观察者模式与c#中的事件与委托

观察者模式概述

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。

观察者模式意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]

public abstract class Subject
{
    List
<Observer> observers = new List<Observer>();

   
public void Add(Observer observer)
    {
        observers.Add(observer);
    }

   
public void Remove(Observer observer)
    {
        observers.Remove(observer);
    }

   
public void Notify()
    {
        observers.ForEach(o
=> o.Update(this));
    }

   
public virtual string GetState()
    {
       
return string.Empty;
    }
}

public class ConcreteSubject1 : Subject
{
   
public override string GetState()
    {
       
return "ConcreteSubject1";
    }
}


public abstract class Observer
{
   
public abstract void Update(Subject subject);
}

public class ConcreteObserver1 : Observer
{
   
public override void Update(Subject subject)
    {
        HttpContext.Current.Response.Write(subject.GetState()
+ "-ConcreteObserver1</br>");
    }
}

public class ConcreteObserver2 : Observer
{
   
public override void Update(Subject subject)
    {
        HttpContext.Current.Response.Write(subject.GetState()
+ "-ConcreteObserver2</br>");
    }
}

 

 

 

 

 protected void Page_Load(object sender, EventArgs e)
    {
        Observer o1
= new ConcreteObserver1();
        Observer o2
= new ConcreteObserver2();
        Subject s1
= new ConcreteSubject1();
        s1.Add(o1);
        s1.Add(o2);
        s1.Notify();
    }

 

 

但是在c#有另一种代替方式,那就是事件与委托。他们其实和观察者模式一个意途和效果。只是经过c#的集成,使用起来更加方便了。

 

实现代码如下:

 

public class EventArgs1 : EventArgs
{
   
public string Value { get; set; }
}

public delegate void Handler(object sender , EventArgs1 e);

public class Subject
{
   
public event Handler Observers;

   
string state;

   
public Subject() { state = "Subject";
    }

   
public string State
    {
       
get { return state; }
    }

   
public void Notify()
    {
        EventArgs1 e
= new EventArgs1();
        e.Value
= "EventArgs1";
        Observers(
this, e);
    }
}

 

 

调用方法:

protected void Page_Load(object sender, EventArgs e)
    {
        Subject s
= new Subject();
        s.Observers
+= new Handler(s_Observers);
        s.Observers
+= new Handler(s_Observers1);
        s.Notify();
    }

   
private void s_Observers(object sender , EventArgs1 e)
    {
        Subject s
= sender as Subject;
        Response.Write(s.State
+ "-" + e.Value + "-Observer1</br>");
    }

   
public void s_Observers1(object sender, EventArgs1 e)
    {
        Subject s
= sender as Subject;
        Response.Write(s.State
+ "-" + e.Value + "-Observer2</br>");
    }


前一篇:定做程序设计
后一篇:管理信息系统毕业设计
分享到: