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); }
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); }
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); } }
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); } }
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"); } }