Observer/Listener学习

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

}


你可能感兴趣的:(Observer/Listener学习)