行为型模式之观察者模式(Observer)

来源:互联网 发布:r语言lda函数源码 编辑:程序博客网 时间:2024/04/30 09:30

观察者模式描述的是事件的通知方式,可用于“订阅-分发”、“监听器”等场景,一个主题对象发生变化时通知所有的观察者进行相应的处理。

JDK自身内置了观察者模式实现,可以直接使用JDK自身的观察者模式!


场景:求职者可以向猎头注册登记,猎头在有工作的时候通知求职者。

设计:

示例代码:

import java.util.ArrayList;import java.util.List;interface JobSeeker {    void assessJob(String job);}interface HeadHunter{    void registerJobSeeker(JobSeeker jobSeeker);    void removeJobSeeker(JobSeeker jobSeeker);    void addJob(String job);    void notifyAllJobSeekers();}class HeadHunterCompany implements HeadHunter {    private List<JobSeeker> jobSeekers = new ArrayList<JobSeeker>();    private String job;    public void registerJobSeeker(JobSeeker jobSeeker) {        jobSeekers.add(jobSeeker);    }    public void removeJobSeeker(JobSeeker jobSeeker) {        jobSeekers.remove(jobSeeker);    }    public void addJob(String job) {        this.job = job;        System.out.println("添加新工作:" + job);        notifyAllJobSeekers();// 关键:通知求职者。    }    public void notifyAllJobSeekers() {        for (JobSeeker jobSeeker : jobSeekers) {            jobSeeker.assessJob(job);        }    }}class Mike implements JobSeeker {    public void assessJob(String job) {        System.out.println("Mike 查看工作: " + job);    }}class Lucy implements JobSeeker {    public void assessJob(String job) {        System.out.println("Lucy 查看工作: " + job);    }}public class Test {    public static void main(String[] args) {        HeadHunter headHunter = new HeadHunterCompany();        headHunter.registerJobSeeker(new Mike());        headHunter.registerJobSeeker(new Lucy());        headHunter.addJob("研发工程师职位");        headHunter.addJob("行政专员职位");    }}
输出:

添加新工作:研发工程师职位Mike 查看工作: 研发工程师职位Lucy 查看工作: 研发工程师职位添加新工作:行政专员职位Mike 查看工作: 行政专员职位Lucy 查看工作: 行政专员职位

使用JDK的观察者模式实现:

import java.util.Observable;import java.util.Observer;class HeadHunterCompany extends Observable {    private String job;    public void addJob(String job) {        this.job = job;        System.out.println("添加新工作:" + job);        // 关键:通知求职者。        setChanged();        // notifyObservers();        notifyObservers(this.job);    }    @Override    public String toString() {        return "猎头公司";    }}class Mike implements Observer {    public void update(Observable o, Object arg) {        System.out.println("Mike 收到来自 " + o + " 的工作: " + arg);    }}class Lucy implements Observer {    public void update(Observable o, Object arg) {        System.out.println("Lucy 收到来自 " + o + " 的工作: " + arg);    }}public class Test {    public static void main(String[] args) {        HeadHunterCompany headHunter = new HeadHunterCompany();        headHunter.addObserver(new Mike());        headHunter.addObserver(new Lucy());        headHunter.addJob("研发工程师职位");        headHunter.addJob("行政专员职位");    }}
输出:

添加新工作:研发工程师职位Lucy 收到来自 猎头公司 的工作: 研发工程师职位Mike 收到来自 猎头公司 的工作: 研发工程师职位添加新工作:行政专员职位Lucy 收到来自 猎头公司 的工作: 行政专员职位Mike 收到来自 猎头公司 的工作: 行政专员职位


原创粉丝点击