设计模式与应用:观察者模式

本文介绍观察者模式,和通过jdk的实现来使用。

简介

观察者模式Observer是行为模式的一种

作用是当一个对象的状态发生变化时,能够自动通知其它关联对象,自动刷新对象状态

Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖他的其它对象之间保持状态同步

结构图

这里写图片描述

实际上,jdk已经有相关的实现,在java.util包中:

public interface Observer 作为观察者。一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。
java.util.Observable作为被观察者。可将其子类化,表示应用程序想要观察的对象。

具体可看文档

角色和职责

  • Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有的观察者对象。Subject需要维持(添加、删除、通知)一个观察者对象的队列列表。
  • Concrete subject:被观察者的具体实现。包含一些基本的属性状态及其它操作
  • Observer(观察者):接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个CallBack函数得到通知
  • Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理

实现

这里写图片描述

具体被观察者

package com.mym.designmodel.observer;

import java.util.Observable;

/**
 * 职责:Concrete Subject(被观察者)被观察的对象
 */
public class BlogUser extends Observable{

    public void publishBlog(String title,String content){
        Blog blog = new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        System.out.println("博主发布新文章,标题:"+title+",内容:"+content);
        this.setChanged();              //标识状态改变
        this.notifyObservers(blog);     //通知观察者,并传参数
    }
}

观察者

package com.mym.designmodel.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 职责:Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理
 */
public class EditorObserver  implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        Blog blog = (Blog) arg;
        System.out.println(" EditorObserver 收到博主的发布消息,发布的文章标题为:"+blog.getTitle()+"   内容为:"+blog.getContent());
    }
}

观察者2

package com.mym.designmodel.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 职责:Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理
 */
public class ReaderObserver implements Observer{
    @Override
    public void update(Observable o, Object arg) {
        Blog blog = (Blog) arg;
        System.out.println(" ReaderObserver 收到博主的发布消息,发布的文章标题为:"+blog.getTitle()+"   内容为:"+blog.getContent());
    }
}

文章

package com.mym.designmodel.observer;

public class Blog {
    private String title;//标题

    private String content;//内容

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

客户端client

package com.mym.designmodel.observer;

/**
 * 测试
 */
public class MainClass{
    public static void main(String[] args) {
        BlogUser blogUser = new BlogUser();
        //添加观察者
        blogUser.addObserver(new ReaderObserver());
        blogUser.addObserver(new EditorObserver());

        blogUser.publishBlog("讲述Observer Model","这里是文章正文!");
    }

}

执行:

博主发布新文章,标题:讲述Observer Model,内容:这里是文章正文!
 EditorObserver 收到博主的发布消息,发布的文章标题为:讲述Observer Model   内容为:这里是文章正文!
 ReaderObserver 收到博主的发布消息,发布的文章标题为:讲述Observer Model   内容为:这里是文章正文!

使用场景

根据介绍可知。类似于消息订阅使用模型的场景都可以使用这个模式,并且jdk本身就提供了实现,很方便

猜你喜欢

转载自blog.csdn.net/maoyuanming0806/article/details/80331189