观察者模式
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新
package gx.subject;
import gx.observer.Observer;
/**
* 主题接口
* @author always
*
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
package gx.observer;
/**
*
* 接受到通知后 数据显示的接口
*
* @author always
*
*/
public interface Display {
void display();
}
package gx.observer;
/**
*
* 观察者的接口
*
* @author always
*
*/
public interface Observer {
/**
* pull:观察者自己获得的想要的数据:“拉”
*/
void update();
/**
* push:主题推送所有消息给观察者
*
* @param tiltle
* @param name
* @param summary
*/
void update(String tiltle,String name,String summary);
}
package gx.observer.impl;
import gx.observer.Display;
import gx.observer.Observer;
import gx.subject.Subject;
import gx.subject.impl.CurrentSubject;
public class StudentObserver implements Observer,Display{
private Subject subject;
private String title;
private String name;
private String summary;
public StudentObserver(){
}
public StudentObserver(Subject subject){
this.subject=subject;
subject.registerObserver(this);
}
public void update() {
if (subject instanceof CurrentSubject) {
CurrentSubject cs = (CurrentSubject) subject;
this.name=cs.getName();
this.title=cs.getTitle();
this.display();
}
}
public void update(String title, String name, String summary) {
this.title=title;
this.name=name;
this.summary=summary;
this.display();
}
public void display() {
System.out.println("我是一名学生,今天我订阅的新闻是:\n 新闻标题:"+title+",新闻作者:"+name+",新闻简介:"+summary+";");
}
}
package gx.observer.impl;
import gx.observer.Display;
import gx.observer.Observer;
import gx.subject.Subject;
import gx.subject.impl.CurrentSubject;
public class TeacherObserver implements Observer,Display{
private Subject subject;
private String title;
private String name;
private String summary;
public TeacherObserver(){
}
public TeacherObserver(Subject subject){
this.subject=subject;
subject.registerObserver(this);
}
public void update() {
if (subject instanceof CurrentSubject) {
CurrentSubject cs = (CurrentSubject) subject;
this.name=cs.getName();
this.title=cs.getTitle();
this.display();
}
}
public void update(String title, String name, String summary) {
this.title=title;
this.name=name;
this.summary=summary;
this.display();
}
public void display() {
System.out.println("我是一名老师,今天我订阅的新闻是:\n 新闻标题:"+title+",新闻作者:"+name+",新闻简介:"+summary+";");
}
}
package gx.subject.impl;
import gx.observer.Observer;
import gx.subject.Subject;
import java.util.ArrayList;
import java.util.List;
/**
* 这个例子:模拟学生,老师 订阅报纸
*
* 此对象改变 依赖它的对象:observerList 中的对象都会收到通知
* setData-->notifyObserver-->observer.update()-->observer.display()
* @author always
*
*/
public class CurrentSubject implements Subject {
private List<Observer> observerList;
private String title;
private String name;
private String summary;
public CurrentSubject(){
observerList=new ArrayList<Observer>();
}
public void registerObserver(Observer observer) {
if(observer!=null){
observerList.add(observer);
}
}
public void removeObserver(Observer observer) {
int indexOf = observerList.indexOf(observer);
if(indexOf!=-1){
observerList.remove(indexOf);
}
}
public void notifyObserver() {
for(Observer observer :observerList){
observer.update(title, name, summary);
}
}
public void setMessage(String title,String name,String summary){
this.title=title;
this.name=name;
this.summary=summary;
notifyObserver();
}
public String getTitle() {
return title;
}
public String getName() {
return name;
}
public String getSummary() {
return summary;
}
}
测试类
package gx.test;
import junit.framework.TestCase;
import gx.observer.Observer;
import gx.observer.impl.StudentObserver;
import gx.observer.impl.TeacherObserver;
import gx.subject.impl.CurrentSubject;
public class TestObserver extends TestCase{
public void testObserverPush(){
CurrentSubject cs= new CurrentSubject();
Observer observer=new StudentObserver(cs);
cs.registerObserver(new StudentObserver());
cs.registerObserver(new TeacherObserver());
cs.setMessage("设计模式","白","你好");//主题状态改变:this.notifyObserver-->observer.update-->observer.display
}
}