写在前面
钩子函数、注册函数、回调函数,他们的概念实际上是同样的。
观察者模式,又能够称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,相似监听器的存在,一旦被观察/监听的目标发生的状况,就会被监听者发现,这么想来目标发生状况到观察者知道状况,实际上是由目标奖状况发送到观察者的。 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当咱们订阅了某我的的微博帐号,当这我的发布了新的消息,就会通知咱们。
观察者模式警匪电影版
观察者接口 (观察者多是警察,也多是线人)
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); } } }
##最后测试一下java
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发现毒贩阿尔法:新货已到达... 毒贩阿尔法:线人被干掉了! 李警官发现毒贩阿尔法:线人被干掉了! 毒贩阿尔法:警察也被干掉了! 毒贩阿尔法:如今我能够没法无天了。。。哈哈哈哈!!! 天降正义!!! 毒贩被一位不肯意透露姓名的大佬带走。。。
###总结ide
关键点: 一、针对观察者与被观察者分别定义接口,有利于分别进行扩展。 二、重点就在被观察者的实现中: (1)定义观察者集合,并定义针对集合的添加、删除操做,用于增长、删除订阅者(观察者) (2)定义通知方法,用于将新状况通知给观察者用户(订阅者用户) 三、观察者中须要有个接收被观察者通知的方法。