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

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

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 收到来自 猎头公司 的工作: 行政专员职位


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值