观察者模式高级应用。根据场景来做出反应。
比如说老师说今天扫地,但是今天不该小明打扫,所以小明在听到这个后不会有反应,但是小红今天打扫,小红就要去打扫清洁。
根据应用场景的不同需求不同。
具体实现方法,是将 抽象类中的notifyObservers方法放到子类中,然后update是根据匹配通知消息的内容用到判断方法。
根据最开始的架构来看
抽象主题角色(取消了notifyObservers方法)
package com.whoami; import java.util.ArrayList; import java.util.List; /** * * @author ZhangYong *观察者接口,知道观察他的观察者,能够添加观察者和删除观察者 */ public class Subject { protected List observers = new ArrayList(); public void add(Observer observer){ observers.add(observer); } public void remove(Observer observer){ observers.remove(observer); } }
抽象观察角色(多传入了两个方法,用于到时候设置判断)
package com.whoami; /** * 观察者接口。 * @author ZhangYong * */ public interface Observer { /** * 更新接口 * @param subject * subject传入目标对象,方便获取状态 */ public void update(Subject subject); public void setObserverName(String observerName); public String getObserverName(); }
具体主题角色(将notifyObservers方法写到了这里,能够判断,根据场景需求推送)
package com.whoami; /** * 具体的被观察的观察对象(班主任) * @author ZhangYong * */ public class SpecificSubject extends Subject { //目标对象状态 private String subjectState; public String getSubjectState() { return subjectState; } /** * * 班主任发布通知 * @param subjectState */ public void setSubjectState(String subjectState) { this.subjectState = subjectState; this.notifyObservers(); } protected void notifyObservers(){ for(Observer observer:observers){ if("小明".equals(observer.getObserverName())){ if("打扫".equals(this.getSubjectState())){ observer.update(this); } } } } }
具体观察者角色
package com.whoami; /** * 继承观察者接口。具体实现update的方法 * @author ZhangYong * */ public class SpecificObserver implements Observer { //观察对象通知 private String observerState; //观察者姓名,标记吧 private String observerName; //观察者将要做什么,也可以是个方法 private String observerThings; public String getObserverState() { return observerState; } public void setObserverState(String observerState) { this.observerState = observerState; } public String getObserverName() { return observerName; } public void setObserverName(String observerNae) { this.observerName = observerNae; } public String getObserverThings() { return observerThings; } public void setObserverThings(String observerThings) { this.observerThings = observerThings; } /** * 接收到通知,响应事件,现在先打印一句话 */ public void update(Subject subject) { observerState = ((SpecificSubject)subject).getSubjectState(); System.out.println(observerName+"得到观察对象的通知是:"+observerState+"。即将做出:"+observerThings); } } [/java] 测试类Main [java] package com.whoami; /** * @author ZhangYong *测试类 */ public class Main { public static void main(String[] args) { //创建观察者对象 SpecificObserver man1 = new SpecificObserver(); man1.setObserverName("同学A"); man1.setObserverThings("我想看数学"); SpecificObserver man2 = new SpecificObserver(); man2.setObserverName("同学B"); man2.setObserverThings("我想看物理"); SpecificObserver man3 = new SpecificObserver(); man3.setObserverName("同学C"); man3.setObserverThings("想看英语"); //添加对象到集合众 SpecificSubject sub = new SpecificSubject(); sub.add(man1); sub.add(man2); sub.add(man3); //观察对象发布通知,创建目标 sub.setSubjectState("我是班主任,现在上自习你们看自己的"); } }
结果: