文档章节

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

月夜筱风
 月夜筱风
发布于 2017/08/30 18:17
字数 1023
阅读 18
收藏 0
点赞 0
评论 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
博文 53
码字总数 19574
作品 0
闵行
程序员
JavaScript设计模式之观察者模式

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

Srtian ⋅ 05/22 ⋅ 0

JavaScript 中常见设计模式整理

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

牧云云 ⋅ 05/18 ⋅ 0

不好意思,观察者模式跟发布订阅模式就是不一样

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

Wilton ⋅ 05/08 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

重学JS(九)—— 观察者模式和发布/订阅模式真不一样

有这么一段代码经常会出现在代码中 测试代码 调用publish后打印出了123 HH。很奇妙的一段代码,当然实际上只是遍历了数组,然后把数组中的所有函数全部执行一遍而已。但是对于一个没读过实现...

闪闪发光的狼 ⋅ 05/17 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 14分钟前 ⋅ 1

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 38分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 43分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部