观察者模式--java

写在前面

钩子函数、注册函数、回调函数,他们的概念实际上是同样的。

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

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

观察者模式警匪电影版

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

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)定义通知方法,用于将新状况通知给观察者用户(订阅者用户)

    三、观察者中须要有个接收被观察者通知的方法。
相关文章
相关标签/搜索