观察者模式
观察者模式 又叫 发布-订阅模式(Publish/Subsribe)
1.Subject类
//抽象类 里面有一个Observer类集合
把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有多个观察者.抽象主题提供一个接口,可以增加和删除观察着对象
2.Observer类
//抽象类
抽象观察者,为所有的具体观察者定义一个接口,在得到主题的更新时提醒自己
3.ConcreteObserver类
//父类是Observer类
具体观察者,实现抽象观察者角色所需求的更新接口,以便使本身的状态与主题的状态相协调
4.ConcreteSubject类
//父类是Subject
具体主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
//Subject类 主题/抽象通知者
abstract class Subject{
private List<Observer> ob=new List<Observer>();
//增加观察者
public void Attach(Observer o){
ob.Add(o);
}
//通知
public void Notify(){
foreach(Observer o in ob){
o.Update();
}
}
}
//Observer类 抽象观察者
abstract class Observer{
public abstract void Update();
}
//ConcreteObserver类 具体主题或者具体通知者
class ConcreteSubject:Subject{
prop string SubjectState{get; set;}
//具体被观察者状态
}
//ConcreteObserver类,具体观察者,实现抽象观察者所需求的更新接口,以便使本身的状态与主体的状态相协调.可以保存一个指向具体对象的引用
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 Update(){
observerState=subject.SubjectState;
Console.WriteLine("");
}
}
//客户端代码
static void Main(string[] args){
ConcreteSubject s=new ConcreteSubject();
s.Attach(new ConcreteObserver(s,"A"));
s.Attach(new ConcreteObserver(s,"B"));
s.SubjectState="aaa";
s.Notify();
}
5.观察者模式的特点
将一个系统分割成一系列相互作用的类有一个很不好的副作用,就是需要维护相关对象间的一致性,使得各个类紧密耦合,这样会给维护,扩展和重用都带来不便
1.一个主题可以有任意数量依赖他的观察者,一旦主题的状态发生改变,所有观察者都可以得到通知
2.主题发出通知不需要知道具体观察者
3.具体观察者也不需要知道其他观察者的存在
/*
当一个对象的改变需要同时改变其他对象的时候使用观察模式
不知道具体有多少对象有待改变时,应考虑使用观察者模式
一个抽象模型有两个方面,其中一个方面依赖于另一个方面
*/
作用
解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化
interface Observer{
void Update();
}
6.事件委托实现
//声明一个委托 时间处理程序EventHandler
delegate void EventHandler();
//在Subject类里声明一个事件Update 类型为委托EventHandler
public event EventHandler Update;
//在访问通知方法时调用更新
public void Notify(){
Update();
}