一、概述
观察者模式的实现可以分为两种,这里先使用第一种实现方式(非 Java 内置方式)。
观察者模式简单来说就是“观察者”监听“被观察者”,一旦“被观察者”发生了变更,则会被“观察者”发现,那么“观察者”就可以根据“被观察者”的变更做出相应的处理。实际上这里所谓的监听,是由被观察者主动通知观察者的。
在观察者模式中,比较重要的地方:被观察者的实现,定义观察者集合,定义观察者的增加、删除、通知方法(通知观察者)。观察者模式定义了对象之间的一对多的依赖关系,这样一来,当一个对象改变状态时,他的所有依赖者(观察者)都会收到通知并自动更新。一个被观察者可以拥有多个观察者,并且通过接口对观察者与被观察者进行逻辑解耦,降低二者的直接耦合。
我们通过公司与公司各事业部之间的公告来实现一下。
如上图中所示:直接上一段测试代码
被观察者接口:
package notice;
/**
* 公告接口
* 对象使用此接口注册为观察者,或将对象自身从观察者中删除
* 由被观察者实现
*
* @author Scott
* @date 2019年10月16号
*/
public interface Notice {
/**
* 注册为观察者
* @param o 观察者对象
*/
void registerObserver(Observer o);
/**
* 删除观察者
* @param o 观察者对象
*/
void removeObserver(Observer o);
/**
* 通知方法
*/
void notifyObservers();
}
被观察者:
package notice;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者(公司总部公告通知)
*
* @author Scott
* @date 2019年10月16号
*/
public class HeadquartersNotice implements Notice {
/** 观察者集合 */
private List<Observer> observerArrayList;
/** 变更内容 */
private String notice;
/**
* 构造方法
*/
public HeadquartersNotice() {
this.observerArrayList = new ArrayList<>(10);
}
/**
* 注册观察者
* @param o 观察者对象
*/
@Override
public void registerObserver(Observer o) {
observerArrayList.add(o);
}
/**
* 移除观察者
* @param o 观察者对象
*/
@Override
public void removeObserver(Observer o) {
if (null == o) {
return;
}
int i = observerArrayList.indexOf(o);
if (i >= 0) {
observerArrayList.remove(i);
}
}
/**
* 通知观察者
*/
@Override
public void notifyObservers() {
observerArrayList.stream().forEach(observer -> observer.update(notice));
}
public String getNotice() {
return notice;
}
/**
* “被观察者” 发生变更时调用 notifyObservers() 方法通知观察者
* 发布新公告时触发通知公司下所有注册了的事业部
*
* @param notice 通知内容
*/
public void setNotice(String notice) {
this.notice = notice;
notifyObservers();
}
}
观察者接口
/**
* 观察者接口
*
* @author Scott
* @date 2019年10月16号
*/
public interface Observer {
/**
* 更新方法
* @param string
*/
void update(String string);
}
/**
* “观察者” 观察到 “被观察者” 发生变更后做出处理的公共接口
*
* @author Scott
* @date 2019年10月16号
*/
public interface LowerHair {
/**
* 下发通知接口
*/
void lowerHair();
}
观察者A
package notice;
/**
* 观察者A(第九事业部)
*
* @author Scott
* @date 2019年10月16号
*/
public class DivisionNine implements Observer, LowerHair {
/** 被观察对象 */
private Notice notice;
/** 变更内容 */
private String string;
/**
* 构造方法
* 将自身设置为观察者
*
* @param notice 被观察者
*/
public DivisionNine(Notice notice) {
this.notice = notice;
notice.registerObserver(this);
}
@Override
public void update(String string) {
this.string = string;
lowerHair();
}
@Override
public void lowerHair() {
System.out.println("第九事业部公司决策通知:" + this.string);
}
}
观察者B
package notice;
/**
* 观察者B (第八事业部)
*
* @author Scott
* @date 2019年10月16号
*/
public class DivisionEight implements Observer, LowerHair{
/** 被观察对象 */
private Notice notice;
/** 变更内容 */
private String string;
/**
* 构造方法
* @param notice 被观察者
*/
public DivisionEight(Notice notice) {
this.notice = notice;
// 注册观察者
notice.registerObserver(this);
}
@Override
public void update(String string) {
this.string = string;
lowerHair();
}
@Override
public void lowerHair() {
System.out.println("第八事业部公司决策通知:" + string);
}
}
测试类:
package notice;
/**
* 测试类
*
* @author Scott
* @date 2019年10月16号
*/
public class TestCompany {
public static void main(String[] args) {
HeadquartersNotice headquartersNotice = new HeadquartersNotice();
DivisionNine divisionNine = new DivisionNine(headquartersNotice);
DivisionEight divisionEight = new DivisionEight(headquartersNotice);
headquartersNotice.setNotice("根据公司发展需要,经研究决定,对第九事业部组织结构调整如下:XXXXXXXX ");
}
}
测试结果: