在使用观察者模式解决实际问题的时候,不同的观察者可能对于同一个目标关注的内容并不相同,对前面的天气实例需求做修改:比如黄明的女朋友只想接收下雨的天气预报,而黄明的母亲想接收下雨或者下雪的天气预报。
定义目标对象的抽象类,因为要区别对待观察者场景,所以目标对象中的notifyObservers方法不能像前面一样在目标对象中实现,它需要定义成 abstract 的,到具体的目标对象中去实现,代码如下:
1 | package com.wy.observer.example_for_difference; |
定义观察者接口:
1 | package com.wy.observer.example_for_difference; |
定义具体的目标对象类,天气状态以及订阅者姓名可以设置到常量中,此处从简,通过循环的方式和条件判断来区别通知:
1 | package com.wy.observer.example_for_difference; |
观察者接口类的实现:
1 | package com.wy.observer.example_for_difference; |
测试类如下:
1 | package com.wy.observer.example_for_difference; |
测试效果如下:
1 | 黄明的女朋友收到了下雨,下雨了,安静待在家里吧 |
将测试类中的天气情况改为下雪:
1 | //4目标发布天气 |
测试效果如下,黄明的女朋友不会收到通知,只有黄明的母亲收到了下雪的通知:
1 | 黄明的母亲收到了下雪,不管下雨下雪,我都不出门 |
代码地址详见 PatternTest
参考资料:
GerryZhang 观察者模式 第4章 观察者模式衍生