行为模式涉及到算法和对象间职责的分配。
观察者:定义对象一对多的关系,当一个对象发生改时,所有依赖于他对象的状态多得到通知发生改变。
package behaviour.observer;
/**
* A concrete subject
*/
import java.util.*;
import java.io.*;
public class ConcreteSubject implements Subject {
private LinkedList observerList;
private Vector strVector;
public ConcreteSubject() {
observerList = new LinkedList();
strVector = new Vector();
}
public void attach(Observer o) {
observerList.add(o);
}
public void detach(Observer o) {
observerList.remove(o);
}
public void sendNotify() {
for(int i = 0; i < observerList.size(); i++) {
((Observer)observerList.get(i)).update(this);
}
}
public void setState(String act, String str) {
if(act.equals("ADD")) {
strVector.add(str);
} else if(act.equals("DEL")) {
strVector.remove(str);
}
}
public Vector getState() {
return strVector;
}
}
package behaviour.observer;
/**
* Observer interface
*/
public interface Observer {
public void update(Subject s);
}
package behaviour.observer;
/**
* A concrete observer
* This concrete observer can change subject through call
* a concrete subject setState function
*/
import java.io.*;
import java.util.*;
public class ObserverA implements Observer {
private Vector strVector;
private Subject sub;
public ObserverA(Subject s) {
sub = s;
//strVector = new Vector();
}
public void update(Subject subject) {
strVector = subject.getState();
System.out.println("----- ObserverA will be updated -----");
for(int i = 0; i < strVector.size(); i++) {
System.out.println("Num " + i + " is :" + (String)strVector.get(i));
}
}
public void change(String action, String str) {
sub.setState(action, str);
//we can auto update
//sub.sendNotify();
}
public void notifySub() {
sub.sendNotify();
}
}
package behaviour.observer;
/**
* A concrete observer
* This observer, can not change subject,
* but it can print the content in vector sorted by alphameric
*/
import java.io.*;
import java.util.*;
public class ObserverB implements Observer {
private Vector strVector;
public ObserverB() {
strVector = new Vector();
}
public void update(Subject subject) {
strVector = (Vector)(subject.getState()).clone();
//----- Sorted vector ---------------------------
for (int i = strVector.size(); --i >= 0; ) {
for (int j = 0; j < i; j++) {
String str1 = (String)strVector.get(j);
String str2 = (String)strVector.get(j+1);
if((str1.compareTo(str2)) > 0) {
strVector.setElementAt(str2, j);
strVector.setElementAt(str1, j+1);
}
}
}
System.out.println("----- ObserverB will be updated -----");
for(int i = 0; i < strVector.size(); i++) {
System.out.println("Num " + i + " is :" + (String)strVector.get(i));
}
}
}
package behaviour.observer;
/**
* Subject interface
* In this interface , we can only declare top 3 function,
* other function we can define in an abstract class which implements
* this interface
*/
import java.util.*;
public interface Subject {
public abstract void attach(Observer o);
public abstract void detach(Observer o);
public abstract void sendNotify();
public abstract Vector getState();
public abstract void setState(String act, String str);
}
package behaviour.observer;
/**
* A test client
*/
public class Test {
public static void main(String[] args) {
Subject mySub = new ConcreteSubject();
ObserverA myObserverA = new ObserverA(mySub);
ObserverB myObserverB = new ObserverB();
mySub.attach(myObserverA);
mySub.attach(myObserverB);
mySub.setState("ADD", "One --- 1");
mySub.setState("ADD", "Tow --- 2");
mySub.sendNotify();
myObserverA.change("DEL", "Tow --- 2");
myObserverA.change("ADD", "Three --- 3");
myObserverA.change("ADD", "Four --- 4");
myObserverA.notifySub();
}
}