傳統的觀察者實現方式:
import java.util.ArrayList;
import java.util.List;
public class TestMaxBy {
public static void main(String[] args) {
Feeder feeder = new Feeder();
feeder.collectAnimal(new Bear());
feeder.collectAnimal(new Tiger());
feeder.distributeAllAnimals("bolster");
}
}
class Bear implements Animal{
@Override
public void distributeFood(String food) {
System.out.println("I don't want to eat " + food);
}
}
class Tiger implements Animal{
@Override
public void distributeFood(String food) {
System.out.println("I want to eat " + food);
}
}
interface Animal{
void distributeFood(String food);
}
interface Subject{
void collectAnimal(Animal animal);
void distributeAllAnimals(String food);
}
class Feeder implements Subject{
private List<Animal> animals = new ArrayList<>();
@Override
public void collectAnimal(Animal animal) {
animals.add(animal);
}
@Override
public void distributeAllAnimals(final String food) {
animals.forEach(a -> a.distributeFood(food));
}
}
使用lambda簡化觀察者設計模式:
import java.util.ArrayList;
import java.util.List;
public class TestMaxBy {
public static void main(String[] args) {
Feeder feeder = new Feeder();
feeder.collectAnimal((food) -> System.out.println("I want to eat " + food));
feeder.collectAnimal((food) -> System.out.println("I don't want to eat " + food));
feeder.distributeAllAnimals("bolster");
}
}
interface Animal{
void distributeFood(String food);
}
interface Subject{
void collectAnimal(Animal animal);
void distributeAllAnimals(String food);
}
class Feeder implements Subject{
private List<Animal> animals = new ArrayList<>();
@Override
public void collectAnimal(Animal animal) {
animals.add(animal);
}
@Override
public void distributeAllAnimals(final String food) {
animals.forEach(a -> a.distributeFood(food));
}
}