博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象行为型 - Observer观察者模式
阅读量:5173 次
发布时间:2019-06-13

本文共 2039 字,大约阅读时间需要 6 分钟。

介绍

观察者模式实质就是定义对象与依赖(对象)之前的关系(一对多),使得如果当前对象自身发生改变时,就可以自动通知其依赖(对象)让其发生改变

使用场景

消息队列(跨系统信息交互)

角色

Subject:抽象主题(被观察者)ConcreteSubject:抽象主题的实现(被观察者)Observer:观察者接口ConcreteObserver:观察者接口实现(观察者)

入门案例:

UML图解:

1245315-20180112004309519-724446027.png

代码:

[Subject]

//主题public abstract class Subject {    //观察者集合    private List
observers = new ArrayList<>(); //添加观察者 public void attach(Observer observer){ observers.add(observer); } //移除观察者 public void detach(Observer observer){ observers.remove(observer); } //通知观察者 public void Notify(){ for (Observer observer : observers) { observer.update(); } }}

[ConcreteSubject]

//具体的主题public class MomSubject extends Subject {    //主题消息    private String msg;    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }}

[Observer]

public interface Observer {    void update();}

[ConcreteObserver]

//具体的观察者public class Son implements Observer {    //名字    private String name;    //观察的主题    private MomSubject subject;    public Son(String name, MomSubject subject) {        this.name = name;        this.subject = subject;    }    @Override    public void update() {        System.out.println(name + "..." + subject.getMsg());    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Subject getSubject() {        return subject;    }    public void setSubject(MomSubject subject) {        this.subject = subject;    }}

测试

public class Main {    public static void main(String[] args){                //创建主题        MomSubject subject = new MomSubject();        //设置观察该主题的观察者        subject.attach(new Son("小强", subject));        subject.attach(new Son("小红", subject));        //设置通知信息        subject.setMsg("吃饭了"); //变动处;做到当主题的msg属性发生改变时,依赖就随之发送变动        //通知观察者更新信息        subject.Notify();        /**         * output:         *  小强...吃饭了            小红...吃饭了         */    }}

转载于:https://www.cnblogs.com/tandi19960505/p/8271444.html

你可能感兴趣的文章
lr_start_transaction/lr_end_transaction事物组合
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
Django基于admin的stark组件创建(一)
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
BeanShell简介
查看>>