1 介绍
Observe模式是行为模式的一种。主要是用来监听对象的变化,当一个对象的状态发生改变时,会自动的通知其它的关联对象。使得该对象和关联对象保持一致。
闲扯
不知道各位简友有没有发现简书是不是缺少一个朋友圈的功能,当好友发表一篇简书后,其它好友会收到通知并可以在朋友圈中进行查看、评论。但目前来说,简书虽然说是有个简友圈,但是主要是来告诉好友自己关注了谁,评论了哪篇文章等。并没有像朋友圈那样强大。不过也许简书设计的初衷就是这样的<a>/(ㄒoㄒ)/~~</a>
但是,作为一个程序猴来说,创造是我们的本能。所以我们要来实现这个功能,使用观察者模式实现<a>发送简书后的通知功能。</a>
2 实现
观察者模式的几个角色
Subject(被观察者):被观察的对象,当被观察对象的状态发生改变时,会通知队列中所有的观察者。(当一篇新的简书发布时,通知其它好友)
ConcreteSubject:被观察者的具体实现,其中包含常见的属性和操作。(一篇简书自带的属性:标题、内容等...)
Observe(观察者):抽象类或接口,当被观察者的状态发生变化时,观察者对象会通过一个callback函数得到通知。
ConcreteObserve:观察者的具体实现,得到通知后完成具体的逻辑实现。(当发了一篇新的简书后以怎样的形式去通知给简友)
具体实现
被观察者:User.class
<!--需要继承Observable--!>
public class User extends Observable{
public void publishArticle(Article article){
System.out.println("我发表文章:标题:"+
article.getTitle() + ",内容为:" + article.getContent());
// 设置被观察者的状态被改变
this.setChanged();
// 通知队列中的其它观察者,并将改变的内容一并发送过去
this.notifyObservers(article);
}
}
ConcreteSubject:Article.class
public class Article {
private String title;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
ConcreteObserve:MyObserve.class
//需要实现Observer接口并实现响应的方法
public class MyObserve implements Observer{
// callBack函数,当被观察者状态发生改变时调用
@Override
public void update(Observable o, Object arg) {
//接收传过来的对象
Article article = (Article)arg;
//通知其它简友的形式
System.out.println("----------------------------------");
System.out.println("有简友发布新文章:标题为:" + article.getTitle());
}
}
测试: MainClass.class
public class MianClass {
public static void main(String[] args) {
Article article = new Article();
article.setTitle("初来乍到");
article.setContent("第一篇简书");
User user = new User();
//为用户注册一个观察者
user.addObserver(new MyObserve());
//用户发表简书,(即被观察者状态发生改变)
user.publishArticle(article);
}
}
这样一来,一个简单的通知功能就完成了,当然一个被观察者可以注册多个观察者,一个观察者也是可以被多个被观察者所注册。
3 应用场景
- 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当改变一个对象的同时需要改变其它对象, 而不知道具体有多少对象有待改变时。