内容简介:大家上学时最害怕的是什么?是不是还被“班主任突然出现在你后面”的恐惧支配着?时不时就得往窗口、门口望一望,老师没过来就接着看小说,老师一过来当然得假装着写作业。万一我们坐在靠近里面的,不方便观察,这时候我们就只能让坐在窗边的王XX代劳了,王XX一看到老师来了,就喊一声,这时我们就明白怎么回事了。定义:观察者模式是软件设计模式的一种。在此种模式中,一个注意点:
大家上学时最害怕的是什么?是不是还被“班主任突然出现在你后面”的恐惧支配着?时不时就得往窗口、门口望一望,老师没过来就接着看小说,老师一过来当然得假装着写作业。万一我们坐在靠近里面的,不方便观察,这时候我们就只能让坐在窗边的王XX代劳了,王XX一看到老师来了,就喊一声,这时我们就明白怎么回事了。
一、定义
定义:观察者模式是软件 设计模式 的一种。在此种模式中,一个 目标物件管理所有相依于它的观察者物件 ,并且在 它本身的状态改变时主动发出通知 。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
注意点:
1、被观察者管理观察者
2、被观察者状态改变时主动发出通知
二、UML类图
在文章开头的描述中,“王XX”看到老师来了就给其他同学发个信号,通知一下。“王XX”是被其他同学观察,即为被观察者。 其他同学则为观察者。
我们定义了一个
Oberable接口,被观察者接口,接口中定义了四个方法:
(1)teacherLeave() 用来发出消息,表示老师离开了
(2)teacherComeBack() 用来发出消息,表示老师回来了
(3)addNotificationStudent() “王XX”同学不可能通知所有同学啊,需要通知的同学需要事先跟“王XX”同学说下。
(4)deleteNotificationStudent() "小丫"同学,现在不需要通知了,通过这个方法让“王XX”同学不再通知她
WangStudent类,表示“王XX”,保存需要通知的同学名单,老师来了就通知这些同学。
IObservor观察者接口,有个方法用来接收“王XX”同学发来的通知。
ObersorStuLi、ObersorStuZhang,李同学、张同学,具体的观察类。
三、代码实现
被观察者接口
package com.design.observor; public interface Observable { public void teacherLeave(); public void teacherComeBack(); public void addNotificationStudent(IObservor observor); public void deleteNotificationStudent(IObservor observor); }复制代码
被观察者“王XX”同学
package com.design.observor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class WangStudent implements Observable { private int state; //需要通知的名单。管理观察者,对应定义注意点1 private List<IObservor> obserbors; public WangStudent(){ obserbors = new ArrayList<>(); } //通知需要通知的同学,老师走了 @Override public void teacherLeave() { state = 1; //被观察者,主动发出通知,对应定义注意点2 Iterator<IObservor> iterator = obserbors.listIterator(); while (iterator.hasNext()){ iterator.next().updateOperation(state); } } //通知需要通知的同学,老师来了 @Override public void teacherComeBack() { state = 0; Iterator<IObservor> iterator = obserbors.listIterator(); while (iterator.hasNext()){ iterator.next().updateOperation(state); } } //增加需要通知的同学 @Override public void addNotificationStudent(IObservor observor) { obserbors.add(observor); } //删除不需要通知的同学 @Override public void deleteNotificationStudent(IObservor observor) { obserbors.remove(obserbors); } }复制代码
观察者接口
package com.design.observor; public interface IObservor { public void updateOperation(int state); }复制代码
观察者同学,“李同学”、“张同学”
package com.design.observor; public class ObservorStuLi implements IObservor{ @Override public void updateOperation(int state) { if(state == 0){ System.out.println("LiXX:老师来了,把小说收了,假装做题!!"); }else{ System.out.println("LiXX:老师走了,继续看小说!!"); } } } 复制代码
package com.design.observor; public class IObservorStuZhang implements IObservor { @Override public void updateOperation(int state) { if(state == 0){ System.out.println("ZhangXX:老师来了,停止跟XX调情,假装做题!!"); }else{ System.out.println("ZhangXX:老师走了,继续跟XX调情!!"); } } }复制代码
测试类
package com.design.observor; public class TestMain { public static void main(String[] args) { Observable wangStu = new WangStudent(); IObservor liStu = new ObservorStuLi(); IObservor zhangStu = new IObservorStuZhang(); //李同学、张同学增加到需要通知的名单中 wangStu.addNotificationStudent(liStu); wangStu.addNotificationStudent(zhangStu); //老师来了 wangStu.teacherComeBack(); //老师走了 wangStu.teacherLeave(); } }复制代码
测试结果
好了,我们完成了这个场景的编程,老师来了、走了,“王XX”同学都通知了张同学,还有李同学,这时张同学、李同学就可以放心玩他们想玩的了。
四、总结
使用场景:当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象待改变时(我们例子中需要通知的同学是通过addNotificationStudent方法动态增加进去的),可以考虑使用观察者模式( 来自《大话设计模式》 )
(一)、优点
1、观察者和被观察者是抽象耦合的。
(二)、缺点
1、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,导致死循环。(A通知B,B通知A,A通知B,B通知A ......)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。