写在前面

钩子函数、注册函数、回调函数,他们的概念其实是一样的。

观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。

  观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

观察者模式警匪电影版

观察者接口 (观察者可能是警察,也可能是线人)

public interface Observer {
void report(String message,String name);
}

观察者实现类 (警察)

public class Policeman implements Observer {
private String name;
Policeman(String name){this.name = name;}
@Override
public void report(String message, String name) {
System.out.println(this.name+"发现"+name+":"+message);
}
}

观察者实现类(线人)

public class Informers implements Observer {
private String name;
Informers(String name){this.name = name;}
@Override
public void report(String message, String name) {
System.out.println(this.name+"发现"+name+":"+message);
}
}

被观察者(坏人) 接口 (具体可能是 小偷,毒贩等。。。)

public interface BadGuy {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void doSomething(String message);
}

小偷


import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue; public class Thief implements BadGuy {
Queue<Observer> queue = new LinkedBlockingQueue<Observer>();
private String name;
Thief(String name){this.name = name;}
@Override
public void addObserver(Observer observer) {
if(!queue.contains(observer)){
queue.add(observer);
}
} @Override
public void removeObserver(Observer observer) {
if(queue.contains(observer)){
queue.remove(observer);
}
} @Override
public void doSomething(String message) {
System.out.println(this.name+" : "+message);
for(Observer observer:queue){
observer.report(message,this.name);
}
}
}

毒贩

import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue; public class Dealer implements BadGuy {
private String name;
Dealer(String name){this.name = name;}
Queue<Observer> queue = new LinkedBlockingQueue<Observer>();
@Override
public void addObserver(Observer observer) {
if(!queue.contains(observer)){
queue.add(observer);
}
} @Override
public void removeObserver(Observer observer) {
if(queue.contains(observer)){
queue.remove(observer);
}
} @Override
public void doSomething(String message) {
System.out.println(this.name+":"+message);
for(Observer observer:queue){
observer.report(message,this.name);
}
}
}

最后测试一下


public class ObserverDemo {
public static void main(String [] args){
Observer policeman = new Policeman("李警官");
Observer informers = new Informers("线人A");
BadGuy thief = new Thief("小偷甲");
BadGuy dealer = new Dealer("毒贩阿尔法"); thief.addObserver(policeman);
thief.addObserver(informers);
thief.doSomething("此处人傻钱多速来"); dealer.addObserver(policeman);
dealer.addObserver(informers);
dealer.doSomething("新货已到达...");
//线人被毒贩发现被干掉
dealer.removeObserver(informers);
dealer.doSomething("线人被干掉了!");
//警察被毒贩发现牺牲了
dealer.removeObserver(policeman);
dealer.doSomething("警察也牺牲了!");
dealer.doSomething("现在我可以无法无天了。。。哈哈哈哈!!!");
new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
System.out.println("天降正义!!! 毒贩被一位不愿意透露姓名的大佬带走。。。");
}
catch(InterruptedException e){
e.printStackTrace();
} }
}.run();
}
}

结果

小偷甲 : 此处人傻钱多速来
李警官发现小偷甲:此处人傻钱多速来
线人A发现小偷甲:此处人傻钱多速来
毒贩阿尔法:新货已到达...
李警官发现毒贩阿尔法:新货已到达...
线人A发现毒贩阿尔法:新货已到达...
毒贩阿尔法:线人被干掉了!
李警官发现毒贩阿尔法:线人被干掉了!
毒贩阿尔法:警察也被干掉了!
毒贩阿尔法:现在我可以无法无天了。。。哈哈哈哈!!!
天降正义!!! 毒贩被一位不愿意透露姓名的大佬带走。。。

总结

 关键点:

    1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。

    2、重点就在被观察者的实现中:

      (1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)

      (2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)

    3、观察者中需要有个接收被观察者通知的方法。

观察者模式--java的更多相关文章

  1. 设计模式之第18章-观察者模式(Java实现)

    设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...

  2. 观察者模式——java设计模式

    观察者模式 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 1.观察者模式的结构 ( ...

  3. 观察者模式/ java实现附代码 /

    /注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...

  4. 设计模式01观察者模式(java)

    先发代码,有空来写内容. observer1 import java.util.Observer; import java.util.Observable; //学生类(Student)继承Obser ...

  5. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  6. 观察者模式 - Java 实现1(使用JDK内置的Observer模式)

    使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) ...

  7. 观察者模式——Java实例

    一.定义 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个 ...

  8. 观察者模式(Java实现)

    import java.util.ArrayList; import java.util.Iterator; /* 抽象观察者类 */ abstract class Observer { public ...

  9. ObserverPattern(观察者模式)-----Java/.Net

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式

随机推荐

  1. 【BZOJ4316】小C的独立集(仙人掌,动态规划)

    [BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...

  2. 「ZJOI2015」地震后的幻想乡 解题报告

    「ZJOI2015」地震后的幻想乡 想了半天,打开洛谷题解一看,最高票是_rqy的,一堆密密麻麻的积分差点把我吓跑. 据说有三种解法,然而我只学会了一种最辣鸡的凡人解法. 题意:给一个无向图\(G\) ...

  3. Balanced Sequence HDU - 6299(杭电多校1 B)

    题目说要n个字符串串内随意组合以后将这些串放在一起,然后求最长的括号匹配的长度,并不要求是连续的 因为不需要是连续的,所以可以先把已经匹配好的括号加入到答案里面去,先把这些删掉,以为并不影响结果,然后 ...

  4. POJ-3687 Labeling Balls(拓扑)

    不一样的拓扑排序 给定一些标记为1到n的数, 求出满足a < b 的序列, 如果有多个输出, 按先标签1往前的位置, 然后按标签2往前的位置, 对于每个标签, 位置都尽量往前. 因为位置要往前, ...

  5. BZOJ2244 拦截导弹

    此题最早看到是在我还什么都不会的去年的暑期集训,是V8讲的DP专题,我当时还跑去问这概率怎么做.这道题要求的是二维最长不上升子序列,加上位置一维就成了三维偏序问题,也就是套用CDQ分治,对位置排序,然 ...

  6. MySQL课堂小测

    目录 一.基本知识与操作方法 二.小测具体内容 (一)向数据库表中添加记录 (二)下载并导入world.sql (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...

  7. 【SFA官方翻译】Spring WebFlux和Spring Cloud进行响应式微服务开发

    源码,修正一些错误: https://github.com/bigben0123/sample-spring-cloud-webflux 原创 SpringForAll社区 2018-05-18 作者 ...

  8. JQuery未来元素事件监听写法

    $(document).on('click','.div1',function(){ alert("abc"); }); 格式一致,第一个参数写事件,第二个参数给谁写事件(选择器) ...

  9. MariaDB安装及基本配置

    MariaDB安装及基本配置(CentOS6.9) 数据库基础概念 数据库(Database, DB)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. DBMS: Database ...

  10. bzoj1030 文本生成器

    题目链接 题意 给出\(n\)个字符串,要构造一个长度为\(m\)的字符串\(S\),使得给出的\(n\)个字符串中至少有一个是\(S\)的子串.问方案数. 思路 \(AC\)自动机+\(DP\) 考 ...