观察者模式:定义一种一对多的依赖关系,让多个观察者对象关联一个对象,当这个对象发生变化时,会通知所有观察者对象,让他们自动更新自己
优点:自动更新状态,不需要额外执行
实现:工作之余,同事之间会讨论股票,讨论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作为一个通知类,把对应观察者放在一个集合里面,当通知类发生一定变化时,统一执行观察者集合。观察者模式的优势在于,当系统被分割成相互协作的类时,需要维护对象之间的一致性,可以避免因为维护一致性造成的各类紧耦合。
