作者:千绝
邮箱:wl625363199@gmail.com
公众号:千绝
标题:设计模式之观察者模式(转载请标明出处)
Hello,各位看官老爷们,千绝我又回来更新了,最近发生了一件可大可小的事,那就是千绝我把公众号迁移到了一个新号上面了,我枯,为了能看到看官老爷们对文章的留言花了我三千大洋,有点心痛,不过能看到你们对文章的评价也值了。
前面一篇千绝介绍了工厂模式,不知道各位看官老爷看的怎么样呢,这篇文章千绝将会介绍设计模式中的观察者模式,这个设计模式呢,千绝认为还是比较简单的,只要看官老爷们认真读我这篇文章如果还不知道观察者模式是什么,以及如何写一个观察者模式,那么你们可以喷我了(QAQ)。
观察者模式
定义
首先惯例我们引用百度百科的内容
观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
千绝对这段定义的理解就是:一个类管理着所有依赖于它的观察者类,并且当它的状态变化时会主动给这些依赖它的类发出通知。
理解还是挺好理解的,如果不能理解上面的话,千绝会用生活当中的例子来给你们讲解的。
例子
假如有一个网站叫终点,是一个专门看小说的网站,我们可以在上面看小说,有一天终点的产品经理说作者更新文章的时候,我们要通知订阅这本小说的读者,取消订阅的就收不到通知。
这个时候千绝一想这不就是观察者模式吗,没事交给我了。
代码
定义一个被观察者接口
public interface Observerable{
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
定义一个观察者接口
public interface Observer{
public void update(String message);
}
定义作者类实现了Observerable接口
public class Author implements Observerable {
private List<Observer> list;
private String name;
private String bookName;
public Author(String name,String bookName){
this.list = new ArrayList<Observer>();
this.name = name;
this.bookName = bookName;
}
public void addObserver(Observer o) {
list.add(o);
}
public void removeObserver(Observer o) {
if(list.contains(o)){
list.remove(o);
}
}
public void notifyObserver() {
for(Observer observer : list){
observer.update(this.name + " 更新了 《" + this.bookName + "》 新的一章");
}
}
}
定义读者类实现Observer接口
public class Reader implements Observer {
private String name;
public Reader(String name){
this.name = name;
}
public void update(String message) {
System.out.println(this.name + " : " +message);
}
}
测试一下
public class TestObserver {
public static void main(String []args){
Author author = new Author("总管","陈平安讲道理");
Reader reader1 = new Reader("reader1");
Reader reader2 = new Reader("reader2");
Reader reader3 = new Reader("reader3");
Reader reader4 = new Reader("reader4");
author.addObserver(reader1);
author.addObserver(reader2);
author.addObserver(reader3);
author.addObserver(reader4);
author.notifyObserver();
System.out.println("reader1取消了订阅");
author.removeObserver(reader1);
author.notifyObserver();
}
}

总管更新了陈平安最新的一章,四个订阅的读者都能收到,后来读者1觉得总管更新的太慢了就取消订阅了,结果总管再更新的时候,读者1就收不到了。
看官老爷们,上面的例子是不是很容易懂,观察者模式就是这么简单的一个模式。如果看不懂可以留言给我,千绝帮你们解惑。
总结
感谢各位看官老爷的收看。
下期预告,迭代器模式。
如果有喜欢千绝的可以关注、评论、转发一下。
也可以关注千绝的公众号,微信搜索千绝,来找我玩吧。
