您的位置:首页 > 其它

浅谈设计模式之观察者模式

2016-05-20 21:01 344 查看
观察者模式将对象与对象之间创建一种依赖关系,当其中一个对象发生变化时,它会将这个变化通知给与其创建关系的对象中,实现自动化的通知更新。

观察者模式又被称为发布-订阅模式,这个叫法应该更好理解,比如说订报,出版社出版了每天的报纸,会将报纸统一发放给所有订阅了这份报纸的客户。只要订阅了这份报纸的人都会收到报纸,没有订阅当然也就不会收到报纸,当然,你单独买的不算==

UML图如下:



除此之外,这种模式还可以结合事件委托(C#),实现更为强大的功能。这里可以简单介绍一下委托,这玩意感觉可以类似于指针来理解,只不过委托指向的变量是函数名,而且委托也有自己的要求,委托对象所搭载的方法必须具有相同的参数列表和返回值。你可能还是不太理解,没关系,看下下面的代码也许能够帮助你理解。

//定义接口
interface Subject
{
string SubjectStte{set; get;}
void Notify();
}

//定义发布者(被观察者)类
class Publisher:Subject
{
//声明一个委托事件
delegate void EventHander();
//Update就相当于一个抽象的指针引用者
public event EventHander Update;

//被发布者的主题状态
string action;
public string SubjectState{
set{ action = value; }
get{ return action; }
}

//呼叫所有订阅者
public void Notify(){
Update();
}

}

//定义订阅者(观察者)类
class Observer
{
string name;
Subject sub;
public Observer(string name,Subject sub){
this.name = name;
this.sub = sub;
}

public void Behavior(){
Print(sub + name);
}
}

//测试代码
static void Main(string[] args)
{
//发布者
Publisher pub = new Publisher();
//订阅者
Observer ob = new Observer("name",pub);

//委托实现,注意:Update和Behavior的参数可返回值是相同的
pub.Update += ob.Behavior;
//这里还可以增加其他的很多委托事件
//pub.Update += ob.Behavior2;……

//更新订阅状态
pub.SubjectState = "Name";

//通知订阅者改变状态
pub.Notify();

Console.Read();
}


当一个对象的改变需要同时改变其他对象的状态,并且不知道具体要改变的对象到底有多少个的时候就应该考虑使用观察者模式。也就是拥有一个发布者和多个订阅者。观察者模式将这种有依赖关系的两者封装在两个对立的对象中,使其各自独立地变化。这个模式应用很广泛,就拿我平时做的游戏来说,一些小红点的新通知,成就系统都可以应用这种模式。

总的来说,它所作工作就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

参考书籍:《大话设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式