设计模式--观察者模式

独自空忆成欢 提交于 2019-12-12 17:08:07

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

观察者模式(observer):

当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!

示例:

观察者模式测试类ObserverTest.java

/**
 * 观察者模式测试类
 *
 * @author Kevin
 * @date 2016-3-15
 */
public class ObserverTest {

	public static void main(String[] args) {
		HeadHunterImpl subject = new HeadHunterImpl();
		subject.addObserver(new JobSeekerImpl("Mike"));
		subject.addObserver(new JobSeekerImpl("Jeff"));

		subject.addJob("Google Job");
		subject.addJob("Apple Job");
	}
}

主题接口类Subject.java

/**
 * 主题接口
 *
 * @author Kevin
 * @date 2016-3-15
 */
public interface Subject {

	/**
	 * 增加观察者
	 *
	 * @author Kevin
	 * @param observer 观察者
	 */
	void addObserver(Observer observer);

	/**
	 * 删除观察者
	 *
	 * @author Kevin
	 * @param observer 观察者
	 */
	void removeObserver(Observer observer);

	/**
	 * 通知所有观察者
	 *
	 * @author Kevin
	 */
	void notifyAllObservers();

}

观察者接口类Observer.java

/**
 * 观察者接口
 *
 * @author Kevin
 * @date 2016-3-15
 */
public interface Observer {

	/**
	 * 更新主题
	 *
	 * @author Kevin
	 */
	void update(Subject subject);

}

猎头类HeadHunterImpl.java

/**
 * 猎头
 *
 * @author Kevin
 * @date 2016-3-15
 */
public class HeadHunterImpl implements Subject {

	/* 求职者列表 */
	private List<Observer> userList;

	/* 工作列表 */
	private List<String> jobList;

	public HeadHunterImpl() {
		userList = new ArrayList<Observer>();
		jobList = new ArrayList<String>();
	}

	@Override
	public void addObserver(Observer observer) {
		userList.add(observer);
	}

	@Override
	public void removeObserver(Observer observer) {
		userList.remove(observer);
	}

	@Override
	public void notifyAllObservers() {
		if (null != userList
				&& userList.size() > 0) {
			for (Observer observer : userList) {
				observer.update(this);
			}
		}
	}

	/**
	 * 增加工作
	 *
	 * @author Kevin
	 * @param job 工作名称
	 */
	public void addJob(String job) {
		this.jobList.add(job);
		notifyAllObservers();
	}

	public List<String> getJobList() {
		return jobList;
	}

	@Override
	public String toString() {
		return jobList.toString();
	}
}

求职者类JobSeekerImpl.java

/**
 * 求职者
 *
 * @author Kevin
 * @date 2016-3-15
 */
public class JobSeekerImpl implements Observer {

	/* 求职者名称 */
	private String name;

	public JobSeekerImpl(String name) {
		this.name = name;
	}

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

		/* 打印工作列表 */
		System.out.println(subject.toString());
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!