Java设计模式-观察者模式

来源:互联网 发布:tp3.2商城项目源码 编辑:程序博客网 时间:2024/05/15 23:52

定义:
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

我们拿订阅新闻做一个例子吧!
场景:当你想知道每天最新的新闻,而自己却嫌麻烦,去找哪些新闻是最新的。那么,你就可以通过微信订阅公众号的方式,公众号会向你推送最新的新闻。

被观察者接口

package com.designpattern.observer;//被观察者接口定义,新闻发布方public interface NewsPrivider {    //移除观察者    void attachUser(User user);    //添加观察者    void detachUser(User user);    //当被观察者方法改变时,调用这个方法通知所有的观察者    void notifyUsers();    //设置要推送的新闻    void setNews(String news);}

观察者接口

package com.designpattern.observer;//观察者接口定义,新闻接收方public interface User {    void receive(String news);}

被观察者实现类

package com.designpattern.observer;import java.util.ArrayList;//新浪新闻,发布新闻的实体类public class SinaNews implements NewsPrivider {    //用于存放和记录订阅了新闻的用户    private ArrayList<User> users= new ArrayList<User>();    //推送新闻    private String news;    @Override    public void attachUser(User user) {        users.add(user);    }    @Override    public void detachUser(User user) {        users.remove(user);    }    @Override    public void notifyUsers() {        for(int i=0;i<users.size();i++){            User user = users.get(i);            user.receive(news);        }    }    //推送新闻的方法,在方法最后调用notifyObserver()方法,通知所有观察者更新状态    public void setNews(String news){        this.news = news;        System.out.println("最新新闻推送:" + news);        this.notifyUsers();    }}

观察者的实现类

package com.designpattern.observer;//用户Apublic class UserA implements User {    @Override    public void receive(String news) {        System.out.println("UserA获得新闻:" + news);    }}
package com.designpattern.observer;//用户Bpublic class UserB implements User{    @Override    public void receive(String news) {        System.out.println("UserB获得新闻:" + news);    }}
package com.designpattern.observer;//用户Cpublic class UserC implements User{    @Override    public void receive(String news) {        System.out.println("UserC获得新闻:" + news);    }}

测试类

package com.designpattern.observer;public class Test {    public static void main(String[] args) {        NewsPrivider sina = new SinaNews();        User a = new UserA();        User b = new UserB();        User c = new UserC();        sina.attachUser(a);        sina.attachUser(b);        sina.attachUser(c);        sina.setNews("中国队成功打入了世界杯!");        sina.setNews("湖人队获得了总冠军!");    }}

测试结果
这里写图片描述

观察者模式UML 图:
这里写图片描述

观察者模式中的4个角色

(1)Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。例如本例中的NewsPrivider。
(2)ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。例如本例中的SinaNews。
(3) Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。例如本例中的User
(4)ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。例如本例中的UserA、UserB、UserC。

使用场合
1.对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2.对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

原创粉丝点击