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

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

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

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();
}

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

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

参考书籍:《大话设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值