Java设计模式:观察者

92 篇文章 0 订阅
87 篇文章 0 订阅

简单来说,观察者模式=发布者+订阅者。

下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,猎头就会把这个信息通知给曾经向他订阅过的人。

observer-pattern

 

Java代码
Subject接口:

//java学习交流:737251827  进入可领取学习资源及对十年开发经验大佬提问,免费解答!
public interface Subject {

    public void registerObserver(Observer observer);

    public void removeObserver(Observer observer);
    public void notifyAllObservers();
}

Observer接口:

public interface Observer {

   public void update(Subject subject);
}

HeadCounter实现了Subject接口,实际上就是发布者:

public class HeadCounter implements Subject {
    private List<Observer> observerList;
    private List<String> jobList;
 
    public HeadCounter(){
       observerList = new ArrayList<Observer>();
        jobList = new ArrayList<String>();
    }

    @Override
    public void registerObserver(final Observer observer) {
        if(! observerList.contains(observer)){
            observerList.add(observer);
        }
    }
    @Override
    public void removeObserver(final Observer observer) {
       if(observerList.contains(observer)){
            observerList.remove(observer);
        }
    }
 
    @Override
    public void notifyAllObservers() {
        for(Observer observer : observerList){
            observer.update(this);
        }
    }
    public void addJob(final String job){
        this.jobList.add(job);
        notifyAllObservers();
    }
    public List<String> getJobs(){
        return jobList;
    }
 
    public String toString(){
        return jobList.toString();
    }

JobSeeker实现了Observer接口,实际上就是订阅者:

public class JobSeeker implements Observer {
    private String name;
 
    public JobSeeker(String name){
        this.name = name;
    }

   @Override
   public void update(Subject subject) {
       System.out.println(this.name + " got notified!");
        System.out.println(subject);
   }
}

程序实例入口:

public class Main {
   public static void main(String[] args) {
      HeadCounter headCounter = new HeadCounter();
               //注册订阅者
       headCounter.registerObserver(new JobSeeker("Mike"));
       headCounter.registerObserver(new JobSeeker("Chris"));
       headCounter.registerObserver(new JobSeeker("Jeff"));
       //通知所有订阅者有新的工作机会
       headCounter.addJob("Google Job");
       headCounter.addJob("Yahoo Job");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值