又叫做发布订阅模式
abstract class Subject {
private IList<Observer> observers = new List<Observer>();
public void Attach(Observer observer) {
observers.Add(observer);
}
public void Detach(Observer observer) {
observers.Remove(observer);
}
public void Notify() {
foreach(Observer o in observers) {
o.Update();
}
}
}
abstract class Observer {
public abstract void Update();
}
// 具体主题
class ConcreteSubject : Subject {
private string subjectState;
public string SubjectState {
get { return subjectState;}
set { subjectState = value;}
}
}
// 具体观察者
class ConcreteObserver : Observer {
private string name;
private string observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,string name) {
this.subject = subject;
this.name = name;
}
public override void Update() {
observerState = subject.SubjectState;
Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
}
public ConcreteSubject Subject {
get {return subject;}
set {subject = value; }
}
}
static void Main(String[] args) {
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s,"X");
s.Attach(new ConcreteObserver(s,"Y");
s.Attach(new ConcreteObserver(s,"Z");
s.SubjectState = "ABC";
s.Notify();
}
一个subject可以有任意数目的依赖它的观察者,一旦subject的状态发生改变,所有observer都可以得到通知
什么时候考虑使用观察者模式:
当一个对象的改变,需要同时改变其他的对象,且它不知道具体有多少对象有待改变时,应考虑使用观察者模式。
观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
事件委托
委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的类,委托的实例将代表一个具体的函数
// 声明了一个特殊的类
delegate void EventHandler();
// 理解为声明一个类的变量
public event EventHandler Update;
一个委托可以搭载多个方法,所有方法被依次唤起,更重要的是,它可以使委托对象所搭载的方法并不需要属于同一个类。