观察者模式 学习记录(1/2 略难看)

观察者模式

观察者模式 又叫 发布-订阅模式(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();
}

posted on 2016-10-19 13:50  天天天命  阅读(200)  评论(0)    收藏  举报

导航