Observer模式UML图
图片源自https://thenewcircle.com/bookshelf/java_fundamentals_tutorial/design_patterns.html
IObserver.java
package com.animal.observer;
public interface IObserver {
void update(DataInfo di);
}
ISubject.java
package com.animal.subject;
import com.animal.observer.DataInfo;
import com.animal.observer.IObserver;
public interface ISubject {
public void attach(IObserver o);
public void deattach(IObserver o);
public void nodify();
public void nodify(DataInfo di);
}
Cat.java--------Observer1
package com.animal.observer;
import com.animal.display.DisplayElement;
public class Cat implements IObserver, DisplayElement{
private DataInfo di;
public DataInfo getDataInfo() {
return di;
}
public void setDataInfo(DataInfo di) {
this.di = di;
}
@Override
public void update(DataInfo di) {
// TODO Auto-generated method stub
setDataInfo(di);
display();
}
public void display() {
System.out.println("Count is " + getDataInfo().count + " Food is " + getDataInfo().food);
}
}
AnimalFeed.java----Subject
package com.animal.subject;
import java.util.ArrayList;
import com.animal.observer.DataInfo;
import com.animal.observer.IObserver;
public class AnimalFeed implements ISubject {
private ArrayList<IObserver> observers;
private DataInfo di;
public AnimalFeed() {
// TODO Auto-generated constructor stub
observers = new ArrayList<IObserver>();
di = new DataInfo();
}
@Override
public void attach(IObserver o) {
// TODO Auto-generated method stub
observers.add(o);
}
@Override
public void deattach(IObserver o) {
// TODO Auto-generated method stub
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
@Override
public void nodify() {
// TODO Auto-generated method stub
}
@Override
public void nodify(DataInfo di) {
// TODO Auto-generated method stub
for (IObserver o : observers) {
o.update(di);
}
}
public void foodChanged(int count, String food) {
this.di.count = count;
this.di.food = food;
nodify(di);
}
}
AnimalStation.java
package com.animal.subject;
import com.animal.observer.Cat;
import com.animal.observer.Dog;
import com.animal.observer.Mouse;
public class AnimalStation {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AnimalFeed af = new AnimalFeed();
Cat cat = new Cat();
Dog dog = new Dog();
Mouse mou = new Mouse();
af.attach(cat);
af.attach(dog);
af.attach(mou);
for (int i = 1; i <= 10; i++) {
if ((i % 2) == 0) {
af.foodChanged(i, "rice");
af.foodChanged(i, "flour");
af.foodChanged(i, "sorghum");
af.deattach(mou);
af.foodChanged(i, "water");
}
}
// af.foodChanged(10, "rice");
// af.foodChanged(5, "flour");
// af.foodChanged(1, "sorghum");
// af.deattach(mou);
// af.foodChanged(3, "water");
}
}