您的位置:首页 > 编程语言 > Java开发

讲故事,学(Java)设计模式—观察者模式

2017-07-27 17:54 423 查看
简而言之,观察者模式=发布者+注册者。

观察者模式用来对GUI中的动作做侦听。Swing GUI的例子就表明了动作侦听是怎样实现观察者模式的。

下面是一个猎头的典型例子。这个图中有2个角色-猎头和求职者。求职者先在猎头处注册,当有新的工作机会时猎头就会通知求职者。


观察者模式类图


Java代码

Subject接口

public interface Subject {

    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyAllObservers();

}

Observer接口

public interface Observer {

    public void update(Subject s);

}

Hunter类实现了Subject接口

import java.util.ArrayList;

 

public class HeadHunter implements Subject{

 

    //define a list of users, such as Mike, Bill, etc.

    private ArrayList<Observer> userList;

    private ArrayList<String> jobs;

 

    public HeadHunter(){

        userList = new ArrayList<Observer>();

        jobs = new ArrayList<String>();

    }

 

    @Override

    public void registerObserver(Observer o) {

        userList.add(o);

    }

 

    @Override

    public void removeObserver(Observer o) {}

 

    @Override

    public void notifyAllObservers() {

        for(Observer o: userList){

            o.update(this);

        }

    }

 

    public void addJob(String job) {

        this.jobs.add(job);

        notifyAllObservers();

    }

 

    public ArrayList<String> getJobs() {

        return jobs;

    }

 

    public String toString(){

        return jobs.toString();

    }

}

JobSeeker是一个观察者:

public class JobSeeker implements Observer {

 

    private String name;

 

    public JobSeeker(String name){

        this.name = name;

    }

    @Override

    public void update(Subject s) {

        System.out.println(this.name + " got notified!");

        //print job list

        System.out.println(s);

    }

}

开始使用:

public class Main {

    public static void main(String[] args) {

        HeadHunter hh = new HeadHunter();

        hh.registerObserver(new JobSeeker("Mike"));

        hh.registerObserver(new JobSeeker("Chris"));

        hh.registerObserver(new JobSeeker("Jeff"));

 

        //每次添加一个个job,所有找工作人都可以得到通知。

        hh.addJob("Google Job");

        hh.addJob("Yahoo Job");

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: