文档章节

设计模式-观察者模式(发布订阅模式)

月夜筱风
 月夜筱风
发布于 2017/08/30 18:17
字数 1023
阅读 26
收藏 0

一,定义

输入图片说明

二,普通版本代码(实际用处不大)

  • 2.1目录

输入图片说明

  • 2.2代码
package com.boot.lijunhao.guanchazhemoshi;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lijunhao on 2017/8/30.
 */
public abstract class Subject {

    //订阅的抽象类,中会包含一些被观察者(也是一个接口或抽象类)
    private List<Observer> observerList=new ArrayList <>();

    //增加被观察者
    void addObserver(Observer observer){
        observerList.add(observer);
    }

    //删除被观察者
    void deleteObserver(Observer observer){
        observerList.removeIf(t->t.equals(observer));
    }

    //通知所有被观察者的变化接口
    void notifyMethod(){
        observerList.forEach(t ->t.getStateMethod());
    }

}

package com.boot.lijunhao.guanchazhemoshi;

import lombok.extern.slf4j.Slf4j;

/**
 * 具体需要监控的属性都写在具体类中
 * Created by lijunhao on 2017/8/30.
 */
@Slf4j
public class RelatedSubject extends Subject {

    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

package com.boot.lijunhao.guanchazhemoshi;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 *
 * 相关的被观察类
 * Created by lijunhao on 2017/8/30.
 */
@Slf4j
@Data
public class RelatedObserver implements Observer {
    //这个可以确定被观察者的id
    private String name;

    //就是对RelatedSubject中相关属性的监视属性(这个值其实是从RelatedSubject取出的state)
    private String state;

    //从这个里面是拿到所被监视的属性,并对变化做出响应
    private RelatedSubject relatedSubject;

    public RelatedObserver(String name, RelatedSubject relatedSubject) {
        this.name = name;
        this.relatedSubject = relatedSubject;
    }

    @Override
    public void getStateMethod() {
        state =  relatedSubject.getState();
        log.info("getState在类(RelatedObserver.java:24)行:{}",name+"的新的状态是"+state);
    }



}

package com.boot.lijunhao.guanchazhemoshi;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 同Relatedbserver,getStateMethod中可以做不同的修改
 * Created by lijunhao on 2017/8/30.
 */
@Slf4j
@Data
public class Related2Observer implements Observer {

    private String name;

    private String state;

    private RelatedSubject relatedSubject;

    public Related2Observer(String name, RelatedSubject relatedSubject) {
        this.name = name;
        this.relatedSubject = relatedSubject;
    }

    @Override
    public void getStateMethod() {
        state =  relatedSubject.getState();
        log.info("getState在类(Related2Observer.java:24)行:{}","另外一个类中的"+name+"的新的状态是"+state);
    }



}

package com.boot.lijunhao.guanchazhemoshi;

/**
 * 被观察者的抽象类中被监视的方法
 * Created by lijunhao on 2017/8/30.
 */
public interface Observer {

    //被监视的方法
    void getStateMethod();
}

package com.boot.lijunhao.guanchazhemoshi;

/**
 * Created by lijunhao on 2017/8/30.
 */
public class Start {

    public static void main(String[] args) {

        RelatedSubject relatedSubject = new RelatedSubject();
        //new RelatedObserver("C",relatedSubject),确定的是C->id和relatedSubject
        relatedSubject.addObserver(new RelatedObserver("C",relatedSubject));
        relatedSubject.addObserver(new RelatedObserver("X",relatedSubject));
        RelatedObserver d = new RelatedObserver("D", relatedSubject);
        Related2Observer e = new Related2Observer("E", relatedSubject);
        relatedSubject.addObserver(e);
        //可以增加被观察者
        relatedSubject.addObserver(d);
        //可以删除被观察者
        relatedSubject.deleteObserver(d);
        //在Subject中设置新的状态
        relatedSubject.setState("新状态");
        //通知方法中
        relatedSubject.notifyMethod();
    }

}

  • 2.3,结果
13:42:11.587 [main] INFO com.boot.lijunhao.guanchazhemoshi.RelatedObserver - getState在类(RelatedObserver.java:24)行:C的新的状态是新状态
13:42:11.602 [main] INFO com.boot.lijunhao.guanchazhemoshi.RelatedObserver - getState在类(RelatedObserver.java:24)行:X的新的状态是新状态
13:42:11.602 [main] INFO com.boot.lijunhao.guanchazhemoshi.Related2Observer - getState在类(Related2Observer.java:24)行:另外一个类中的E的新的状态是新状态

三,java自带版本

3.1 在Java中通过Observable类和Observer接口实现了观察者模式

输入图片说明

  • 3.2 代码
package com.boot.lijunhao.guanchazhemoshi;

import java.util.Observable;

/**
 * Created by lijunhao on 2017/8/31.
 */
public class JavaObserver extends Observable {
    //被监视的属性
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        //每次set改变的时候就调用setChanged()和notifyObservers()去通知所有观察者,然后去执行他们的update方法
        this.state = state;
        int j = countObservers();

        System.out.println("1"+j);
        //告诉被改变了
        setChanged();
        int i = countObservers();
        System.out.println("1"+i);
        //通知所有的观察者
        notifyObservers();
    }
}

package com.boot.lijunhao.guanchazhemoshi;

import java.util.Observable;

/**
 * 同JavaObserver的作用
 * Created by lijunhao on 2017/8/31.
 */
public class JavaObserver2 extends Observable {

    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        int j = countObservers();
        System.out.println("2"+j);
        setChanged();
        //一般是在这里增加订阅
        addObserver(new JavaSubject());
        addObserver(new JavaSubject2());
        int i = countObservers();
        System.out.println("2"+i);
        notifyObservers();
    }
}

package com.boot.lijunhao.guanchazhemoshi;

import java.util.*;
import java.util.Observer;

/**
 * Created by lijunhao on 2017/8/31.
 */
public class JavaSubject implements Observer {

    //无参构造
    public JavaSubject() {
    }

    //方便添加addObserver
    public JavaSubject(JavaObserver javaObserver) {
        javaObserver.addObserver(this);
    }
    //方便添加addObserver
    public JavaSubject(JavaObserver2 javaObserver) {
        javaObserver.addObserver(this);
    }

    //update方法每次修改( setChanged 和notifyObservers)就会自动调用的
    @Override
    public void update(Observable o, Object arg) {
        if(o instanceof JavaObserver){
            JavaObserver javaObserver =  (JavaObserver)o;
            System.out.println(javaObserver.getState());
        }else{
            JavaObserver2 javaObserver =  (JavaObserver2)o;
            System.out.println(javaObserver.getState());
        }
    }
}

package com.boot.lijunhao.guanchazhemoshi;

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

/**
 * 作用同JavaSubject
 * Created by lijunhao on 2017/8/31.
 */
public class JavaSubject2 implements Observer {

    //需要在
    public JavaSubject2() {
    }

    public JavaSubject2(JavaObserver javaObserver) {
        javaObserver.addObserver(this);
    }

    public JavaSubject2(JavaObserver2 javaObserver) {
        javaObserver.addObserver(this);
    }

    //update方法每次修改( setChanged 和notifyObservers)就会自动调用的
    @Override
    public void update(Observable o, Object arg) {
        if(o instanceof JavaObserver){
            JavaObserver javaObserver =  (JavaObserver)o;
            System.out.println(javaObserver.getState()+"dsssssssssgdfgdfgfjtrfsdcsadsdgfsdfsdsafsdfsdfdsfs");
        }else{
            JavaObserver2 javaObserver =  (JavaObserver2)o;
            System.out.println(javaObserver.getState()+"dsssssssssgdfgdfgfjtrfsdcsadsdgfsdfsdsafsdfsdfdsfs");
        }
    }
}

package com.boot.lijunhao.guanchazhemoshi;

/**
 * Created by lijunhao on 2017/8/31.
 */
public class JavaStart {

    public static void main(String[] args) {
        JavaObserver javaObserver = new JavaObserver();
        JavaObserver2 javaObserver2 = new JavaObserver2();
        //在这里增加订阅类
        new JavaSubject(javaObserver);
        new JavaSubject(javaObserver2);
        new JavaSubject2(javaObserver2);
        javaObserver.setState("fdddddddddddddddddd");
        javaObserver.setState("dfdgdfgfgdf");
        javaObserver2.setState("ddddddddddddddddddddddddddddddddddddddddddddddddd");
    }
}

  • 3.3,结果
11
11
fdddddddddddddddddd
11
11
dfdgdfgfgdf
22
24
ddddddddddddddddddddddddddddddddddddddddddddddddddsssssssssgdfgdfgfjtrfsdcsadsdgfsdfsdsafsdfsdfdsfs
ddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddsssssssssgdfgdfgfjtrfsdcsadsdgfsdfsdsafsdfsdfdsfs
ddddddddddddddddddddddddddddddddddddddddddddddddd

© 著作权归作者所有

共有 人打赏支持
月夜筱风
粉丝 0
博文 55
码字总数 19574
作品 0
闵行
程序员
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
观察者模式 vs 发布-订阅模式

我曾经在面试中被问道,“观察者模式和发布订阅模式的有什么区别?” 我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回答...

缪宇
06/29
0
0
JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian
05/22
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0
不好意思,观察者模式跟发布订阅模式就是不一样

一、前言 一天,小猪佩奇去了一家西餐厅,点了一份西冷牛扒,还叫了圣女果。后来服务员上了一碟番茄,佩奇小姐:这是你的「圣女果」。佩奇猪一眼就看出了猫腻:这tm是番茄,不是圣女果啊!于...

Wilton
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部