23种软件设计模式完整教程
介绍
观察者模式(Observer Pattern)定义了对象之间的一对多依赖,让多个观察者对象同 时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通 知并更新,属于行为型模式。
优点
1、观察者和被观察者之间建立了一个抽象的耦合。
2、观察者模式支持广播通信。
缺点
1、观察者之间有过多的细节依赖、提高时间消耗及程序的复杂度。
2、使用要得当,要避免循环调用。
使用场景
微信朋友圈动态通知、优快云生态圈消息通知、邮件通知、广播通知、桌面程序等
使用建议
观察模式实际开发中使用的较少,一般涉及到观察者的地方都用三方MQ消息组件替代。
具体实现
(实例一)JDK实现:老师监听学生提交作业
类图
代码
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import lombok.Data;
public class Question {
private String userName;
private String content;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import java.util.Observable;
import java.util.Observer;
public class Teacher implements Observer {
private String name;
public Teacher(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
HomeWork homeWork=(HomeWork)o;
Question question=(Question)arg;
System.out.println("++++++++++++消息实时通知++++++++++++++");
System.out.println(name+"老师,你好\n"+
"你收到一条来自:"+homeWork.getName()+" 作业提交,提问者:" +question.getUserName()+"问题内容:\n"+
question.getContent()+"\n"+
"");
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import java.util.Observable;
public class HomeWork extends Observable {
private String name="学生作业统一管理平台";
private static HomeWork homeWork=null;
private HomeWork(){}
public static HomeWork getIntance(){
if(null==homeWork){
homeWork=new HomeWork();
}
return homeWork;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void publichQuestion(Question question){
System.out.println(question.getUserName()+"提了一个问题,内容是:\n"+question.getContent());
setChanged();
notifyObservers(question);
}
}
(实例二)使用guava实现一个简单的观察者
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;
import com.google.common.eventbus.Subscribe;
public class GuavaEvent {
@Subscribe
public void subscribe(String str){
System.out.println("执行subscribe方法,传入参数是:"+str);
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;
import com.google.common.eventbus.EventBus;
public class Test {
public static void main(String[] args) {
EventBus eventBus=new EventBus();
GuavaEvent guavaEvent=new GuavaEvent();
eventBus.register(guavaEvent);
eventBus.post("boubou");
}
}