程序员:我终于知道什么是观察者模式了

514 阅读3分钟

作者:千绝

邮箱: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就收不到了。

看官老爷们,上面的例子是不是很容易懂,观察者模式就是这么简单的一个模式。如果看不懂可以留言给我,千绝帮你们解惑。

总结

感谢各位看官老爷的收看。

下期预告,迭代器模式。

如果有喜欢千绝的可以关注、评论、转发一下。

也可以关注千绝的公众号,微信搜索千绝,来找我玩吧。

在这里插入图片描述