package cn.sun.code.fourteen;
import java.util.ArrayList;
/**
* 主题对象或抽象通知者,一般用一个抽象类或一个接口实现。
* 它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以用任何数量的观察者。
* 抽象主题提供一个接口,可以增加和删除观察者对象。
*/
abstract class Subject {
private ArrayList<Observer> observerArrayList = new ArrayList<Observer>();
// 增加观察者
public void attach(Observer observer) {
observerArrayList.add(observer);
}
// 移除观察者
public void deatch(Observer observer) {
observerArrayList.remove(observer);
}
// 通知
public void notifyObserver() {
for (Observer observer : observerArrayList) {
observer.update();
}
}
}
package cn.sun.code.fourteen;
/**
* 具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,
* 给所有登记过的通知者发出通知。
* 具体主题角色通常用一个具体子类实现。
*/
public class ConcreteSubject extends Subject {
private String subjectStatus;
public String getSubjectStatus() {
return subjectStatus;
}
public void setSubjectStatus(String subjectStatus) {
this.subjectStatus = subjectStatus;
}
}
package cn.sun.code.fourteen;
/**
* Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
* 这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。
* 更新接口通常包含一个update方法,这个方法叫做更新方法。
*/
abstract class Observer {
public abstract void update();
}
package cn.sun.code.fourteen;
/**
* 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
* 具体观察者角色可以保存一个角色可以保存一个指向具体主题对象的应用。
* 具体观察者角色通常用一个具体子类实现。
*/
public class ConcreteObserver extends Observer {
private String name;
private String observerStatus;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
this.name = name;
this.subject = subject;
}
@Override
public void update() {
observerStatus = subject.getSubjectStatus();
System.out.println("观察者" + name + "的收到木叶新状态是:" + observerStatus);
}
}
package cn.sun.code.fourteen;
/**
* 客户端代码
*/
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.attach(new ConcreteObserver("雾之国",subject));
subject.attach(new ConcreteObserver("砂之国",subject));
subject.attach(new ConcreteObserver("土之国",subject));
subject.setSubjectStatus("被佩恩攻打");
subject.notifyObserver();
}
}
// 观察者雾之国的收到木叶新状态是:被佩恩攻打
// 观察者砂之国的收到木叶新状态是:被佩恩攻打
// 观察者土之国的收到木叶新状态是:被佩恩攻打
java.util.Observer
这个接口:public interface Observer {
/**
* This method is called whenever the observed object is changed. An
* application calls an <tt>Observable</tt> object's
* <code>notifyObservers</code> method to have all the object's
* observers notified of the change.
*
* @param o the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
* method.
*/
void update(Observable o, Object arg);
}
update()方法
,被观察者的notifyObservers()
方法就会调用这个方法。public class Observable {
private boolean changed = false;
private Vector obs;
/** Construct an Observable with zero Observers. */
public Observable() {
obs = new Vector();
}
/**
* Adds an observer to the set of observers for this object, provided
* that it is not the same as some observer already in the set.
* The order in which notifications will be delivered to multiple
* observers is not specified. See the class comment.
*
* @param o an observer to be added.
* @throws NullPointerException if the parameter o is null.
*/
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
...
}
方法 | 作用 |
---|---|
addObserver(Observer o) |
向观察者集合中添加观察者 |
clearChanged()、hasChanged()、setChanged() |
这三个方法算是一对,用它们来标记主题对象的状态是否改变 |
countObservers() |
返回观察者对象的数目 |
deleteObserver(Observer o) |
删除某个观察者 |
deleteObservers() |
清楚观察者列表 |
notifyObservers()、notifyObservers(Object arg) |
若本对象有变化,则通知所有登记的观察者,调用update() 方法 |
package cn.sun.code.fourteen;
import java.util.Observable;
import java.util.Observer;
public class MyTomcat extends Observable {
private String status = "";
public String getStatus() {
return status;
}
public MyTomcat(Observer o) {
addObserver(o);
}
public void setStatus(String status) {
if (!this.status.equals(status)) {
this.status = status;
setChanged();
}
notifyObservers();
}
}
package cn.sun.code.fourteen;
import java.util.Observable;
import java.util.Observer;
/**
* 自定义观察者
*/
public class MySpring implements Observer {
String status = "";
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public void update(Observable o, Object arg) {
this.status = ((MyTomcat) o).getStatus();
System.out.println("MySpring状态与MyTomcat状态(" + this.status + ")一致");
}
/**
* 模拟客户端
*
* @param args
*/
public static void main(String[] args) {
// 创建观察者对象
MySpring mySpring = new MySpring();
// 创建主题对象,并将观察者对象添加入主题对象
MyTomcat myTomcat = new MyTomcat(mySpring);
myTomcat.setStatus("start");
myTomcat.setStatus("close");
}
}
/**
*MySpring状态与MyTomcat状态(start)一致
*MySpring状态与MyTomcat状态(close)一致
*/
原文:https://www.cnblogs.com/riders/p/12197360.html