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

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

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

一、观察者模式引入

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

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

下面是类图:

二、观察者模式设计举例

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

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

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

1、定义主题接口

Code:
  1. public interface Subjects{   
  2. //注册订阅用户   
  3. public void registerObservers(Observer o);   
  4. //对用户发送新的通知   
  5. public void notifyObservers();   
  6. //注销用户   
  7. public void removeObservers(Observer o);   
  8. }  

2、定义观察者接口

Code:
  1. public interface Observer{   
  2. //notice通过调用此方法实现向订阅者发送信息的功能   
  3. public void givenotice(String s);   
  4. }  

3、定义Notice类

Code:
  1. import java.util.ArrayList;       
  2. //实现主题接口       
  3. public class Notice implements Subjects{       
  4.       
  5. private String ss = new String();       
  6. private ArrayList observers;       
  7. public Notice(){       
  8. observers = new ArrayList();       
  9. }    
  10. //主题接口方法,注销订阅用户   
  11. public void removeObservers(Observer o){   
  12. int i = observers.indexOf(o);   
  13. if (i>=0){   
  14. observers.remove(i);   
  15. }   
  16. }      
  17. //主题接口方法,添加订阅的用户       
  18. public void registerObservers (Observer o){       
  19. observers.add(o);       
  20. }       
  21. //主题接口方法,通过遍历向订阅者发送消息       
  22. public void notifyObservers(){       
  23. for (int i=0; i<observers.size();i++){       
  24. Observer observer = (Observer)observers.get(i);       
  25. observer.givenotice(ss);       
  26. }       
  27. }       
  28. //供测试用       
  29. public void setContent(String ss){       
  30. this.ss = ss;             
  31. this.notifyObservers();       
  32. }       
  33. }      

4、定义Student类

Code:
  1. public class Student implements Observer{   
  2. //实现Observer的方法   
  3. public void givenotice(String ss){   
  4.   
  5. System.out.println("学生:"+ss);   
  6. }   
  7. }  

5、再定义一个Teacher类

Code:
  1. public class Teacher implements Observer{   
  2.   
  3. //实现observers中的givenotice()方法   
  4. public void givenotice(String ss){   
  5.   
  6. System.out.println("老师:"+ss);   
  7.   
  8. }   
  9. }  

6、用Test类实现测试

Code:
  1. public class Test{   
  2. //这是测试   
  3. public static void main(String args[]){   
  4. Notice n = new Notice();   
  5. Student student = new Student();   
  6. Teacher teacher = new Teacher();   
  7. n.registerObservers(student);   
  8. n.registerObservers(teacher); 
  9.   
  10. //因为没有可以自动调用Notice中的方法的实现,所以,只好通过这个测试了   
  11. n.setContent("ahaha"); 
  12. //注销student用户  
  13. n.removeObservers(student);
    n.setContent("ahaha");
  14. }   
  15. }  

7、输出结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值