大话设计模式-----观察者模式

来源:互联网 发布:纸黄金行情软件 编辑:程序博客网 时间:2024/05/19 01:14

1 什么是观察者模式

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并且自动更新。

2 一个例子

比如说定报纸

  1. 报社的业务就是出版报纸。
  2. 向某家报社订报纸,只要你是他们的订户,你就一直会收到新的报纸。
  3. 当你不想看报纸了,你就取消订阅。
  4. 只要报社没有倒闭,就会源源不断的有人订阅报纸或者取消订阅。

3 构成

观察者模式有两大组成,一个是:主题,也就是我们的报社,另外一个就是观察者,也就是我们的用户。如图:

这里写图片描述

3 例子

主题接口

public interface ISubject {    public void registObserver(IObserver o);    public void removeObserver(IObserver o);    /**     * 当主题改变时便会通知所有观察者     */    public void notifyObservers();}

观察者接口

public interface IObserver {    /**     * 当出新报纸了,主题便会调用这个方法,把新报纸内容传递过来。     * @param content     */    public void update(String content);}

报纸类

public class NewsPaper implements ISubject {    private ArrayList<IObserver> obs;    private String content;    @Override    public void registObserver(IObserver o) {        obs.add(o);    }    @Override    public void removeObserver(IObserver o) {        obs.remove(o);    }    @Override    public void notifyObservers() {        for (IObserver ob : obs) {            ob.update(content);        }    }    public NewsPaper() {        obs = new ArrayList<IObserver>();    }    /**     * 出新报纸调用这个方法     * @param content     */    public void publish(String content){        this.content = "新报纸出版了,内容是:"+content;        notifyObservers();    }}

公司类(公司也可以订报纸)

public class Company implements IObserver {    @Override    public void update(String content) {        System.out.println("公司收到了新报纸,"+content);    }}

个人类

public class Person implements IObserver {    @Override    public void update(String content) {        System.out.println("个人收到了新报纸,"+content);    }}

测试类

public class MyTest {    public static void main(String[] args) {        NewsPaper newspaper = new NewsPaper();        Person person = new Person();        Company company = new Company();        // 订报纸        newspaper.registObserver(person);        newspaper.registObserver(company);        //发行报纸        newspaper.publish("周三的新报纸");    }}
0 0