核心提示:观察者模式与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 调用方法: protected void Page_Load(object sender, EventArgs e)
{
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);
}
}
{
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>");
}
前一篇:定做程序设计
后一篇:管理信息系统毕业设计