观察者模式(Observer Pattern)
观察者模式是对象的行为模式,又叫做发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
类图:
Subject接口:
package observer.subject;
import observer.observer.Observer;
public interface Subject {
public void attach(Observer o);
public void detach(Observer o);
public void notifyObservers();
}
public interface Subject {
public void attach(Observer o);
public void detach(Observer o);
public void notifyObservers();
}
ConcreteSubject类:
package observer.subject;
import java.util.Enumeration;
import java.util.Vector;
import observer.observer.Observer;
public class ConcreteSubject implements Subject{
private Vector observersVector = new Vector();
public void attach(Observer o) {
observersVector.addElement(o);
}
public void detach(Observer o) {
observersVector.removeElement(o);
}
public void notifyObservers() {
Enumeration enmu = observes();
while(enmu.hasMoreElements()){
((Observer)enmu.nextElement()).update();
}
}
public Enumeration observes(){
return ((Vector) observersVector.clone()).elements();
}
}
import java.util.Vector;
import observer.observer.Observer;
public class ConcreteSubject implements Subject{
private Vector observersVector = new Vector();
public void attach(Observer o) {
observersVector.addElement(o);
}
public void detach(Observer o) {
observersVector.removeElement(o);
}
public void notifyObservers() {
Enumeration enmu = observes();
while(enmu.hasMoreElements()){
((Observer)enmu.nextElement()).update();
}
}
public Enumeration observes(){
return ((Vector) observersVector.clone()).elements();
}
}
Observer接口:
package observer.observer;
public interface Observer {
public void update();
}
public void update();
}
ConcreteObserver类:
package observer.observer;
public class ConcreteObserver implements Observer{
public void update() {
System.out.println("I am noticed......");
}
}
Client类:
package observer;
import observer.observer.ConcreteObserver;
import observer.observer.Observer;
import observer.subject.ConcreteSubject;
import observer.subject.Subject;
public class Client {
public static void main(String args[]){
Subject subject = new ConcreteSubject();
Observer o = new ConcreteObserver();
subject.attach(o);
subject.notifyObservers();
subject.detach(o);
subject.notifyObservers();
}
}
import observer.observer.Observer;
import observer.subject.ConcreteSubject;
import observer.subject.Subject;
public class Client {
public static void main(String args[]){
Subject subject = new ConcreteSubject();
Observer o = new ConcreteObserver();
subject.attach(o);
subject.notifyObservers();
subject.detach(o);
subject.notifyObservers();
}
}
示例二:
1、结构
2、java代码
Subject接口:
package observer1.subject;
import java.util.Enumeration;
import java.util.Vector;
import observer1.observer.Observer;
abstract public class Subject {
private Vector observersVector = new Vector();
public void attach(Observer o) {
observersVector.addElement(o);
}
public void detach(Observer o) {
observersVector.removeElement(o);
}
public void notifyObservers() {
Enumeration enmu = observes();
while(enmu.hasMoreElements()){
((Observer)enmu.nextElement()).update();
}
}
public Enumeration observes(){
return ((Vector) observersVector.clone()).elements();
}
}
import java.util.Vector;
import observer1.observer.Observer;
abstract public class Subject {
private Vector observersVector = new Vector();
public void attach(Observer o) {
observersVector.addElement(o);
}
public void detach(Observer o) {
observersVector.removeElement(o);
}
public void notifyObservers() {
Enumeration enmu = observes();
while(enmu.hasMoreElements()){
((Observer)enmu.nextElement()).update();
}
}
public Enumeration observes(){
return ((Vector) observersVector.clone()).elements();
}
}
ConcreteSubject类:
package observer1.subject;
public class ConcreteSubject extends Subject{
private String state;
public void change(String state){
this.state = state;
System.out.println("State is " + this.state);
this.notifyObservers();
}
}
private String state;
public void change(String state){
this.state = state;
System.out.println("State is " + this.state);
this.notifyObservers();
}
}
Observer接口:
package observer1.observer;
public interface Observer {
public void update();
}
public void update();
}
ConcreteObserver类:
package observer1.observer;
public class ConcreteObserver implements Observer{
public void update() {
System.out.println("I am noticed......");
}
}
Client类:
package observer1;
import observer1.observer.ConcreteObserver;
import observer1.observer.Observer;
import observer1.subject.ConcreteSubject;
public class Client {
private static ConcreteSubject subject;
private static Observer observer;
public static void main(String args[]) {
subject = new ConcreteSubject();
observer = new ConcreteObserver();
subject.attach(observer);
subject.change("new state");
}
}
import observer1.observer.Observer;
import observer1.subject.ConcreteSubject;
public class Client {
private static ConcreteSubject subject;
private static Observer observer;
public static void main(String args[]) {
subject = new ConcreteSubject();
observer = new ConcreteObserver();
subject.attach(observer);
subject.change("new state");
}
}