可能就是所谓的观察者模式

直接崩溃了,看了好长时间才明白一点其中的意思,先初次记录一下,等有更深层次的理解时再继续编辑。

在《Head.First设计模式》中,对观察者模式的解释非常生动,理解起来也很容易,但是,真正自己写一个实现为什么怎么就这么难呢?哎……好吧,记录一下主要的学习内容。

一、观察者模式引入

首先,说一下这个被称为皇后的观察者模式:观察者模式定义了一系列对象之间的一对多依赖关系;当一个对象改变状态,其他依赖者都会收到通知并自动更新。其中,“一”指的是主题,“多”指的是观察者。观察者可以“注册”后获得“主题”改变时的及时通知。

如果还不是很好理解,我们继续:比如有读者乐乐、皮皮、大皮皮、破皮。出版社发放报纸,四位读者可以订阅。如果乐乐想订阅,那么,他会告诉出版商,我要订阅报纸,之后,出版社一有新的报纸出来的时候,就会及时发放到乐乐手中。同理,皮皮想订阅的话,也可以这样。如果订阅一段时间后,乐乐不想订了,可以直接告诉出版商,我不订阅了,这样,之后的信息更新就不会再通知给乐乐。 观察者模式就是这样一个过程,可以灵活的接受对象的“注册”,也可以允许用户对象“注销”。“注册”的用户可以及时得到主题对象的更新内容,而没有订阅的就不能得到。

下面是类图:

二、观察者模式设计举例

实现功能:学校发布信息,学生可以订阅,老师可以订阅,行政人员也可以订阅。

思路:定义主题接口,观察者接口,定义Notice 、学生、老师和行政人员类,定义测试类。其中Notice类实现主题接口,老师、学生和行政人员实现观察者接口。

实现过程:(注释中有解释)

1、定义主题接口

Code:
  1. publicinterfaceSubjects{
  2. //注册订阅用户
  3. publicvoidregisterObservers(Observero);
  4. //对用户发送新的通知
  5. publicvoidnotifyObservers();
  6. //注销用户
  7. publicvoidremoveObservers(Observero);
  8. }

2、定义观察者接口

Code:
  1. publicinterfaceObserver{
  2. //notice通过调用此方法实现向订阅者发送信息的功能
  3. publicvoidgivenotice(Strings);
  4. }

3、定义Notice类

Code:
  1. importjava.util.ArrayList;
  2. //实现主题接口
  3. publicclassNoticeimplementsSubjects{
  4. privateStringss=newString();
  5. privateArrayListobservers;
  6. publicNotice(){
  7. observers=newArrayList();
  8. }
  9. //主题接口方法,注销订阅用户
  10. publicvoidremoveObservers(Observero){
  11. inti=observers.indexOf(o);
  12. if(i>=0){
  13. observers.remove(i);
  14. }
  15. }
  16. //主题接口方法,添加订阅的用户
  17. publicvoidregisterObservers(Observero){
  18. observers.add(o);
  19. }
  20. //主题接口方法,通过遍历向订阅者发送消息
  21. publicvoidnotifyObservers(){
  22. for(inti=0;i<observers.size();i++){
  23. Observerobserver=(Observer)observers.get(i);
  24. observer.givenotice(ss);
  25. }
  26. }
  27. //供测试用
  28. publicvoidsetContent(Stringss){
  29. this.ss=ss;
  30. this.notifyObservers();
  31. }
  32. }

4、定义Student类

Code:
  1. publicclassStudentimplementsObserver{
  2. //实现Observer的方法
  3. publicvoidgivenotice(Stringss){
  4. System.out.println("学生:"+ss);
  5. }
  6. }

5、再定义一个Teacher类

Code:
  1. publicclassTeacherimplementsObserver{
  2. //实现observers中的givenotice()方法
  3. publicvoidgivenotice(Stringss){
  4. System.out.println("老师:"+ss);
  5. }
  6. }

6、用Test类实现测试

Code:
  1. publicclassTest{
  2. //这是测试
  3. publicstaticvoidmain(Stringargs[]){
  4. Noticen=newNotice();
  5. Studentstudent=newStudent();
  6. Teacherteacher=newTeacher();
  7. n.registerObservers(student);
  8. n.registerObservers(teacher);
  9. //因为没有可以自动调用Notice中的方法的实现,所以,只好通过这个测试了
  10. n.setContent("ahaha");
  11. //注销student用户
  12. n.removeObservers(student);
    n.setContent("ahaha");
  13. }
  14. }

7、输出结果

学生:ahaha
老师:ahaha
老师:ahaha(注销student后)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值