观察者模式

嗯,前一篇我们讲了策略模式,这篇我们讲讲观察者模式...观察者模式应该算是程序设计中最常用胡模式之一了.

先描述一下问题:我们常常会遇到这种情况,当你在A类中有内容更新的时候,你想要通知B类去刷新内容。这个时候你会怎么做呢?一个办法是,你可以传递一个B类的引用到A类中,假设说B类中有一个update方法用于更新数据。你可以在A类中内容改变的时候,调用B类的update方法。这样做的限制在于A类的接受者只有B类一个,而且B类不想再接收消息时没有相应的方法取消。不过也有很多情况下,B类的确是作为唯一的消息接收者,而且不用取消,所以采用这种办法虽然有点丑陋,但的确可以接受。

于是我们马上想到用接口来代替,在A类中声明一个监听器接口数组。在B类中实现具体的接口方法,传递一个A类的引用给B类,让B类可以注册一个监听器。这样在A类有内容刷新的时候就可以直接从已经注册的监听器接口数组中去调用刷新方法。然后B类在不需要接受的时候,注销掉接受方法。

但这样做仍然有一些问题,A类每次有内容更新的时候,它会将所有内容都push给注册了监听器的接口实现类,因为它不知道哪些类需要哪些数据。一个办法是可以提供一系列getter方法,然后只是提醒监听器该更新了,然后让接口实现类自己去获取数据。

还有一个问题是,如果B类中更新需要用到比较耗时的操作时,那么B类的刷新频率是不应该太高的。这样可以在A类中设置一个更新标志,当数据达到一定量的时候,将标志置为true,更新完后重新置为false。

实际上java提供了一个java.util.Observable类用于实现发送者的类,然后提供了一个接口java.util.Observer用于实现接受者类,但是由于发送消息的类是一个具体类,所以造成了很多限制,如果A类要同时继承另外一个类的话,就与java中不能多继承的原则产生了矛盾,所以基本上还是需要自己去实现这样一个接口,不仅灵活度大,而且不用担心多继承的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值