观察者模式:定义一种一对多的依赖关系,让多个观察者对象关联一个对象,当这个对象发生变化时,会通知所有观察者对象,让他们自动更新自己
优点:自动更新状态,不需要额外执行
实现:工作之余,同事之间会讨论股票,讨论NBA等,但是如果让老板看到,即使本职工作已经完成,老板依然会不爽。这时候,就有同事跟前台打好关系,当老板回来时,通知大家,让大家回归工作状态。
1、抽象观察者、抽象通知者
/**
* 抽象观察者
*/
public abstract class Observer {
/**
* 观察者名称
*/
String name;
/**
* 通知类
*/
Subject sub;
/**
* 修改方法
*/
public abstract void update();
}
/**
* 抽象通知类
*/
public abstract class Subject {
/**
* 添加被通知观察者
*/
public abstract void addObserver(Observer observer);
/**
* 移除被通知观察者
*/
public abstract void deleteObserver(Observer observer);
/**
* 通知
*/
public abstract void notifit();
/**
* 通知消息
*/
String subjectStaff;
public String getSubjectStaff() {
return subjectStaff;
}
public void setSubjectStaff(String subjectStaff) {
this.subjectStaff = subjectStaff;
}
}
2、观察者实现
/**
* 看NBA的员工
*/
public class ObserverStaffNba extends Observer{
public ObserverStaffNba(String name , Subject sub){
super.name = name;
super.sub = sub;
}
/**
* 修改方法
*/
public void update(){
System.out.println(MessageFormat.format("{0},{1}关闭NBA,开始工作", sub.getSubjectStaff() , this.name));
}
}
/**
* 看股票的员工
*/
public class ObserverStaffShares extends Observer{
public ObserverStaffShares(String name , Subject sub){
super.name = name;
super.sub = sub;
}
/**
* 修改方法
*/
public void update(){
System.out.println(MessageFormat.format("{0},{1}关闭股票,开始工作", sub.getSubjectStaff() , this.name));
}
}
3、通知者实现
/**
* 前台
*/
public class SubjectReception extends Subject{
List<Observer> list = new ArrayList<>();
public void addObserver(Observer observer){
list.add(observer);
}
public void deleteObserver(Observer observer){
list.remove(observer);
}
public void notifit(){
list.forEach(observer -> {
observer.update();
});
}
}
4、测试
/**
* 测试观察者模式
*/
public class TestObserver {
public static void main(String [] args){
Subject subject = new SubjectReception();
subject.addObserver(new ObserverStaffNba("张三", subject));
subject.addObserver(new ObserverStaffShares("李四", subject));
subject.setSubjectStaff("老板来了");
subject.notifit();
}
}
测试结果:
观察者模式又成为发布-订阅模式,Subject作为一个通知类,把对应观察者放在一个集合里面,当通知类发生一定变化时,统一执行观察者集合。观察者模式的优势在于,当系统被分割成相互协作的类时,需要维护对象之间的一致性,可以避免因为维护一致性造成的各类紧耦合。