观察者模式

第一、观察者模式定义

观察者模式(ObServer Pattern)定义对象之间的一对多的依赖,让多个观察者对象同时监听一个对象,当主体对象发生变化时,它的所有依赖者(观察者)

都会收到通知并更新,其实就是发布定义模式,发布者发布消息,订阅者获取消息,订阅了就能接收到消息,没有订阅就接收不到消息。

第二、观察者模式应用场景

Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册分布式配置中心

第三、观察者模式原理类图

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,

可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态

第四、观察者模式简单实现

/**
 * 抽象主题
 */
public interface AbstractSubject {
    /**
     * 添加ObServer 添加订阅者
     * @param obServer
     */

    public void  addObServer(ObServer obServer);

    /**
     * 移除ObServer
     * @param obServer
     */
    public void removeObServer(ObServer obServer);

    /**
     * 通知所有的ObServer
     * @param message
     */
    public void notifyObServerAll(String message);

    /**
     * 设置更新内容
     * @param message
     */
    public  void setNtifyMessage(String message);
}
/**
 * 抽象观察者
 *
 */
public interface ObServer {

    //更新内容
    public void update(String message);
}

/**
 * 具体观察者
 */
public class UserObServer implements ObServer {

    private String name;
    public UserObServer(String name){
        this.name = name;
    }
    @Override
    public void update(String message) {
            this.name = name;
            this.read(message);
    }

    /**
     * 读取消息
     * @param message
     */
    public void read(String message) {
        System.out.println(name + ",老师收到推送消息:" + message);
    }
}
/**
 * 抽象主题
 */
public class WeChatSubject implements AbstractSubject {
    private List<ObServer> obServerList = new ArrayList<ObServer>();
    private String message;
    @Override
    public void addObServer(ObServer obServer) {
        obServerList.add(obServer);
    }

    @Override
    public void removeObServer(ObServer obServer) {
        obServerList.remove(obServer);
    }

    @Override
    public void notifyObServerAll(String message) {
        for (ObServer server : obServerList) {
            server.update(message);
        }
    }

    @Override
    public void setNtifyMessage(String message) {
        this.message = message;
        System.out.println("微信公众号设置message:" + message);
        //通知所有的订阅者接收消息
        notifyObServerAll(message);
    }
}
/**
 * 测试类
 */
public class Test001 {
    public static void main(String[] args) {
        //注册主题
        AbstractSubject weChatSubject = new WeChatSubject();
        weChatSubject.addObServer(new UserObServer("小强"));
        weChatSubject.addObServer(new UserObServer("小张"));
        //发送消息
        weChatSubject.setNtifyMessage("今天下午到我办公室来一趟!!!有重大的事情安排");
    }
}

第五、JDK自带观察实现消息发送

1). Observable类追踪所有的观察者,并通知他们。

2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。

 

/**
 * JDK提供的一种观察者的实现方式,被观察者
 * 自定义一个主题
 */
public class MessageObServable extends Observable {

    private String name;

    MessageObServable(String name){
        this.name = name;
    }

    public  void publishMessage(Message message){
        System.out.println(message.getName() + "在" + this.name + "上提交了一个问题。");
        //改变数据
        setChanged();
        //通知所有的观察者
        notifyObservers(message);
    }

}
/**
 * 信息实体
 */
public class Message {

    private String name;
    private String content;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public String getContent() {
        return content;
    }
}
/**
 *自定义观察者
 */
public class Teacher  implements Observer {

    private String name;
    public Teacher(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
         MessageObServable userObServer = (MessageObServable) o;
         Message message = (Message) arg;
        System.out.println(this.name+"向"+message.getName()+"描述了:"+message.getContent());
    }
}
/**
 * 测试类
 */
public class Test001 {
    public static void main(String[] args) {
      MessageObServable messageObServable = new MessageObServable("张三");
      messageObServable.addObserver(new Teacher("李四"));
      messageObServable.addObserver(new Teacher("王五"));
      Message message = new Message();
      message.setName("王五");
      message.setContent("今天迟到了!!!!");
      messageObServable.publishMessage(message);
    }
}

 

posted @ 2019-09-03 23:38  吊儿郎当小少年  阅读(267)  评论(0编辑  收藏  举报