观察者模式(Observer)

1 我觉得这个观察者模式很有趣的!!

2 在软件系统中,我们有时需要定义一种一对多的依赖关系. 让多个观察者对象同时监听某一个主题对象, 这个主题对象在状态发生变化的时候,会通知所有的观察者对象,使他们能够自动更新自己。

如:在你写好了博文的时候,你去表发了,你就可以利用这个观察者模式去通知你被关注的人!

3 实现方式:该模式必须包含两个角色:观察者和被观察对象。就像上面的那个例子,博主就是被观察的对象,而关注博主的人就是观察者。

4 “观察”:实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

结构图:

那么我们就来写一写这个代码:博主发博客。。。通知关注了他的人  他发了博客。。。。

文章类:

 1 package com.lovo.Observer.two;
 2 public class Article {
 3     
 4     private String subject;
 5     
 6     private String Content;
 7 
 8     public String getSubject() {
 9         return subject;
10     }
11 
12     public void setSubject(String subject) {
13         this.subject = subject;
14     }
15 
16     public String getContent() {
17         return Content;
18     }
19 
20     public void setContent(String content) {
21         Content = content;
22     }
23 
24         
25 }

 被观察者:

 1 package com.lovo.Observer.two;
 2 import java.util.Observable;
 3 public class Blogger extends Observable{
 4     
 5     private String name;
 6     
 7     public String getName() {
 8         return name;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14 
15     public void publish(Article wz){
16         this.setChanged();// 标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
17         this.notifyObservers(wz);// 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,
18         
19     }
20 
21 }

 

 观察者

 1 package com.lovo.Observer.two;
 2 import java.util.Observable;
 3 import java.util.Observer;
 4 
 5 
 6 public class Observer1 implements Observer {
 7 
 8     @Override
 9     public void update(Observable observerable, Object obj) {        
10         Blogger bz = (Blogger) observerable;        
11         Article wz = (Article) obj;
12         
13         System.out.println("博主:"+bz.getName());
14         System.out.println("博主发表了新的博客");
15         System.out.println("博客的主题为:"+wz.getSubject());
16         System.out.println("博客的内容为:"+wz.getContent());
17         
18     }
19 
20 }

 

测试类:

 1 package com.lovo.Observer.two;
 2 
 3 public class TestObserver {
 4 
 5      public static void main(String[] args) {
 6         
 7          Article wz = new Article();         
 8          wz.setSubject("这是我的第一篇博文");         
 9          wz.setContent("欢迎大家来看我的博客,我会好好努力的!。。。。。。");         
10          Blogger bz = new Blogger();
11          bz.setName("hellokitty燕");
12          bz.addObserver(new Observer1());
13          bz.publish(wz);
14          
15          
16     }
17     
18 }

 

实现结果为:

博主:hellokitty燕
博主发表了新的博客
博客的主题为:这是我的第一篇博文
博客的内容为:欢迎大家来看我的博客,我会好好努力的!。。。。。。

 

posted @ 2015-07-17 00:35  NAYNEHC  阅读(768)  评论(1编辑  收藏  举报