java设计模式之观察者模式

来源:互联网 发布:农村淘宝宝网址是什么 编辑:程序博客网 时间:2024/06/05 19:14

java设计模式参考文章:
Java设计模式实战,23种设计模式介绍以及在Java中的实现,Java设计模式, Java经典设计模式之五大创建型模式


## 定义 ##

Observer模式是行为模式之一,定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并被自动更新。

## 代码示例 ##

  • 在博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息。这是如何实现的? 是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者, 然后循环的把消息发给订阅者,这样就会显得更人性化了。这就是观察者模式,观察者模式有两个对象:博主,订阅者。 当读者在订阅时,会把读者信息放到一个队列里面去,方便在博客主布时循环这个对列并发送消息。
/** * @author bwx * @date 2017/11/28 * 观察者抽象接口 */public interface Observers {    void update(String msg);}/** * @author bwx * @date 2017/11/28 * 博客观察者(订阅者) */public class BlogObServer implements Observers {    public void update(String msg) {        System.out.println("观察者收到消息:" + msg);    }}/** * @author bwx * @date 2017/11/28 * 订阅者的注册中心或者主题抽象类 */public abstract class Subject {    protected List<Observers> observers = new LinkedList<Observers>();    public void attach(Observers observer) {        observers.add(observer);    }    public void detach(Observers observer) {        observers.remove(observer);    }    protected abstract void notifyObservers();}/** * @author bwx * @date 2017/11/28 * 订阅者的注册中心或者主题 */public class BlogSubject extends Subject {    protected void notifyObservers() {        for (Observers observer : observers) {            observer.update("已经发布博客");        }    }}public class Main {    public static void main(String[] args) {        BlogSubject blogSubject = new BlogSubject();        blogSubject.attach(new BlogObServer());        System.out.println("发布博客");        blogSubject.notifyObservers();    }}

## 使用jdk实现观察者模式 ##

/** * @author bwx * @date 2017/11/28 * 博客对象 */public class Blog {    private String articleTitle;    private String articleContent;    public String getArticleTitle() {        return articleTitle;    }    public void setArticleTitle(String articleTitle) {        this.articleTitle = articleTitle;    }    public String getArticleContent() {        return articleContent;    }    public void setArticleContent(String articleContent) {        this.articleContent = articleContent;    }}/** * @author bwx * @date 2017/11/28 */public class BlogObServer implements Observer {    /**     * This method is called whenever the observed object is changed. An     * application calls an <tt>Observable</tt> object's     * <code>notifyObservers</code> method to have all the object's     * observers notified of the change.     *     * @param o   the observable object.     * @param arg an argument passed to the <code>notifyObservers</code>     */    public void update(Observable o, Object arg) {        Blog blog = (Blog) arg;        System.out.println("观察者收到blog内容消息:" + blog.getArticleContent());        System.out.println("观察者收到blog标题消息:" + blog.getArticleTitle());    }}/** * @author bwx * @date 2017/11/28 * 订阅者的注册中心或者主题 */public class BlogSubject extends Observable {    public void publishBlog(String articleTitle,String articleContent) {        Blog blog = new Blog();        blog.setArticleTitle(articleTitle);        blog.setArticleContent(articleContent);        System.out.println("发布博客");        this.setChanged();        this.notifyObservers(blog);    }}/** * @author bwx * @date 2017/11/28 * 使用jdk实现观察者模式 */public class Main {    public static void main(String[] args) {        BlogSubject blogSubject = new BlogSubject();        blogSubject.addObserver(new BlogObServer());        blogSubject.publishBlog("blog标题", "blog内容");    }}

## 解析 ##

  • 拉模型,拉的方式就是主题的数据更新后,不直接将数据推给客户端,而是先推送一个通知并提供对应的方法供客户端拉取数据。
  • 推模型 ,Subject主动向观察者推送有关状态的详细信息, 推送的信息通常是目标对象的全部或部分数据. 观察者只能被动接收。