写在前面

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

  1. 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。
  2.   观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

观察者模式警匪电影版

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

  1. public interface Observer {
  2. void report(String message,String name);
  3. }

观察者实现类 (警察)

  1. public class Policeman implements Observer {
  2. private String name;
  3. Policeman(String name){this.name = name;}
  4. @Override
  5. public void report(String message, String name) {
  6. System.out.println(this.name+"发现"+name+":"+message);
  7. }
  8. }

观察者实现类(线人)

  1. public class Informers implements Observer {
  2. private String name;
  3. Informers(String name){this.name = name;}
  4. @Override
  5. public void report(String message, String name) {
  6. System.out.println(this.name+"发现"+name+":"+message);
  7. }
  8. }

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

  1. public interface BadGuy {
  2. void addObserver(Observer observer);
  3. void removeObserver(Observer observer);
  4. void doSomething(String message);
  5. }

小偷


  1. import java.util.Queue;
  2. import java.util.concurrent.LinkedBlockingQueue;
  3. public class Thief implements BadGuy {
  4. Queue<Observer> queue = new LinkedBlockingQueue<Observer>();
  5. private String name;
  6. Thief(String name){this.name = name;}
  7. @Override
  8. public void addObserver(Observer observer) {
  9. if(!queue.contains(observer)){
  10. queue.add(observer);
  11. }
  12. }
  13. @Override
  14. public void removeObserver(Observer observer) {
  15. if(queue.contains(observer)){
  16. queue.remove(observer);
  17. }
  18. }
  19. @Override
  20. public void doSomething(String message) {
  21. System.out.println(this.name+" : "+message);
  22. for(Observer observer:queue){
  23. observer.report(message,this.name);
  24. }
  25. }
  26. }

毒贩

  1. import java.util.Queue;
  2. import java.util.concurrent.LinkedBlockingQueue;
  3. public class Dealer implements BadGuy {
  4. private String name;
  5. Dealer(String name){this.name = name;}
  6. Queue<Observer> queue = new LinkedBlockingQueue<Observer>();
  7. @Override
  8. public void addObserver(Observer observer) {
  9. if(!queue.contains(observer)){
  10. queue.add(observer);
  11. }
  12. }
  13. @Override
  14. public void removeObserver(Observer observer) {
  15. if(queue.contains(observer)){
  16. queue.remove(observer);
  17. }
  18. }
  19. @Override
  20. public void doSomething(String message) {
  21. System.out.println(this.name+":"+message);
  22. for(Observer observer:queue){
  23. observer.report(message,this.name);
  24. }
  25. }
  26. }

最后测试一下


  1. public class ObserverDemo {
  2. public static void main(String [] args){
  3. Observer policeman = new Policeman("李警官");
  4. Observer informers = new Informers("线人A");
  5. BadGuy thief = new Thief("小偷甲");
  6. BadGuy dealer = new Dealer("毒贩阿尔法");
  7. thief.addObserver(policeman);
  8. thief.addObserver(informers);
  9. thief.doSomething("此处人傻钱多速来");
  10. dealer.addObserver(policeman);
  11. dealer.addObserver(informers);
  12. dealer.doSomething("新货已到达...");
  13. //线人被毒贩发现被干掉
  14. dealer.removeObserver(informers);
  15. dealer.doSomething("线人被干掉了!");
  16. //警察被毒贩发现牺牲了
  17. dealer.removeObserver(policeman);
  18. dealer.doSomething("警察也牺牲了!");
  19. dealer.doSomething("现在我可以无法无天了。。。哈哈哈哈!!!");
  20. new Runnable() {
  21. @Override
  22. public void run() {
  23. try{
  24. Thread.sleep(1000);
  25. System.out.println("天降正义!!! 毒贩被一位不愿意透露姓名的大佬带走。。。");
  26. }
  27. catch(InterruptedException e){
  28. e.printStackTrace();
  29. }
  30. }
  31. }.run();
  32. }
  33. }

结果

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

总结

  1.  关键点:
  2.     1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。
  3.     2、重点就在被观察者的实现中:
  4.       1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)
  5.       2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)
  6.     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. php unset对json_encode的影响

    先运行一段php代码: $a = Array(0=>'hello world', 1=>'girl', 2=>'boy'); var_dump(json_encode($a)); u ...

  2. 使用template

    1.放置html片段模板 <script id="tpl" type="text/html"> <p>$title</p>& ...

  3. CSS实现背景透明,文字不透明(兼容所有浏览器)

    我们平时所说的调整透明度,其实在样式中是调整不透明度,如下图所示例: 打开ps,在图层面板上,可以看到设置图层整理不透明度的菜单,从 0% (完全透明)到 100%(完全不透明). 实现透明的css方 ...

  4. mui 对话框 点击按钮不关闭对话框的办法

    目前版本的 mui.js 点击对话框的按钮只能关闭对话框 做如下修改 点击按钮后return false 即可

  5. A1130. Infix Expression

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  6. A1003. Emergency

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  7. css之文本两端对齐

    在进行网页设计时,我们经常会看到这样的样式:文本两端对齐. css为我们提供了一个属性可以实现这样的效果:text-align: justify.不过这个只能用来设置多行文本(除最后一行).如果只有单 ...

  8. 【译】6. Java反射——Getter和Setter

    原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...

  9. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

  10. linux 下配置svn

    1.以前配置好的,没做笔记,忘记了.现在重新回忆 查找svn目录:find / -name svn 找到/projects/svn cd /projects/svn 看里面的配置: 查看配置 [roo ...