设计模式之第18章-观察者模式(Java实现)
话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队。英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影《滴露牡丹开》中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队。这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨。(众人:鱼哥,你扯远了)。咳咳,这个狗仔队其实嘛,也就是所谓进行监视观察活动,接下来就让观察者来给我们讲讲观察者与设计模式不得不说的那些个事儿。
观察者模式之自我介绍
额就四(我就是)观察者,也被称作依赖或者发布订阅,是在项目中经常用到的一种模式。定义如下:Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.翻译过来就是说:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者的通用类图如下:
观察者模式之自我分析
首先来说下好处:
- 支持广播通信。
- 目标和观察者之间抽象耦合。
接着是缺点部分:
- 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
- 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
- 另外多级触发的效率也需要考虑到。
观察者模式之实现
至于实现那么就以“贱人曽”来举个栗子吧。就拿曾小贤来举栗子(贤哥,我不是有意的,不要怪我撒,我知道你是LOLer,打得还不错),首先是被观察者Observable,就是名人,比如说曽大大,习大大,Linus大大等等:
1 public interface Obeservable{ 2 //增加观察者 3 public void addObserver(Observer observer); 4 //删除观察者 5 public void deleteObserver(Observer observer); 6 //发生改变通知观察者 7 public void notifyObservers(String context); 8 }
这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:
1 public interface IZengXiaoXian{ 2 //吃饭 3 public void eat(); 4 //睡觉 5 public void sleep(); 6 //玩 7 public void play(); 8 }
小贤的接口包含3个活动,吃饭、睡觉、打豆豆,啊,口滑了,是玩耍,娱乐活动,比如说和子萱出去玩耍了之类的,下面是具体的小贤的实现类:
1 public class ZengXiaoXian implements IZengXiaoXian,Obserable{ 2 //定义动态数组存放不同媒体的狗仔队 3 private ArrayList<Observer> observerList = new ArrayList<>(); 4 //增加观察者 5 public void addObserver(Observer observer){ 6 this.observerList.add(observer); 7 } 8 //删除观察者 9 public void deleteObserver(Observer observer){ 10 this.observerList.remove(observer); 11 } 12 //发生改变通知观察者 13 public void notifyObservers(String context){ 14 for (Observer observer : observerList ) { 15 observer.update(context); 16 } 17 } 18 //吃饭 19 public void eat(){ 20 System.out.println("曾小贤要吃饭了"); 21 this.notifyObservers("曾小贤要吃饭了"); 22 } 23 //睡觉 24 public void sleep(){ 25 System.out.println("曾小贤要睡觉了"); 26 this.notifyObservers("曾小贤要睡觉了"); 27 } 28 //玩 29 public void play(){ 30 System.out.println("曾小贤要玩耍了"); 31 this.notifyObservers("曾小贤要玩耍了"); 32 } 33 }
被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:
1 public interface Observer{ 2 //发现被观察的人有动静,就开始准备写稿子,整头条什么的 3 public void update(String context); 4 }
然后就是狗仔队的实现了,狗仔队一号出动:
1 public class Paparazzo1 implements Observer{ 2 //狗仔队一号一旦发现有什么爆料,就告诉老板 3 public void update(String str){ 4 System.out.println("观察到曾小贤和张子萱拥吻,开始汇报"); 5 this.reportToXX(str); 6 } 7 //汇报给XX媒体 8 private void reportToXX(String context){ 9 System.out.println("老大,我看到"+context); 10 } 11 }
如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:
1 public class Client{ 2 public static void main(String[] args) { 3 //出来一个狗仔队 4 Observer paparazzo = new Paparazzo(); 5 6 //曾小贤出场 7 ZengXiaoXian zengxiaoxian = new ZengXiaoXian(); 8 zengxiaoxian.addObserver(paparazzo); 9 10 //看看曾小贤在干嘛 11 zengxiaoxian.eat(); 12 zengxiaoxian.play(); 13 zengxiaoxian.sleep(); 14 } 15 }
好了,基本实现就是这样子了。
观察者模式之应用场景
当你遇到以下任意一种情况,可以考虑使用额来实现:
- 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
这个时候就轮到我登场了,狗仔队就是额,额就四狗仔队,噢耶。“动二动二,我是动幺,这里有一名疑似精神病院跑出来的患者,赶紧给予抓捕带回”,“鱼哥,救额,额不是精神病,你快告诉他们。”(作者按:少一个了,这样以后就少一个人和我抢零食了。默默离开)。金坷垃刺秦王,设计模式任我闯。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦