观察者模式(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燕
博主发表了新的博客
博客的主题为:这是我的第一篇博文
博客的内容为:欢迎大家来看我的博客,我会好好努力的!。。。。。。
每件事都需要坚持!