模式原型:
实例:
public interface Observer { public abstract void update(NumberGenerator numberGenerator); }
public abstract class NumberGenerator { private ArrayList observers = new ArrayList(); public void addObserver(Observer observer) { observers.add(observer); } public void deleteObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { Iterator iterator = observers.iterator(); while (iterator.hasNext()) { Observer ob = (Observer) iterator.next(); ob.update(this); } } public abstract int getNumber();//获取数值 public abstract void execute(); //生成数值 }
public class RandomNumberGenerator extends NumberGenerator{ private Random random = new Random(); private int number; @Override public int getNumber() { return number; } @Override public void execute() { for(int i = 0;i < 10; i++){ number = random.nextInt(60); notifyObservers(); } } }
public class GraphObserver implements Observer { @Override public void update(NumberGenerator numberGenerator) { System.out.println("GraphObserver"); for (int i = 0; i < numberGenerator.getNumber(); i++) { System.out.print("*"); } System.out.println(); try { Thread.sleep(100); } catch (Exception e) { } } }
public class DigitObserver implements Observer { @Override public void update(NumberGenerator numberGenerator) { System.out.println("DigitObserver:" + numberGenerator.getNumber()); try { Thread.sleep(100); } catch (Exception e) { } } }
public class Main { public static void main(String[] args) { NumberGenerator generator = new RandomNumberGenerator(); generator.addObserver(new DigitObserver()); generator.addObserver(new GraphObserver()); generator.execute(); } }
结果:
DigitObserver:22
GraphObserver
**********************
DigitObserver:47
GraphObserver
***********************************************
DigitObserver:12
GraphObserver
************
DigitObserver:44
GraphObserver
********************************************
DigitObserver:48
GraphObserver
************************************************
DigitObserver:3
GraphObserver
***
DigitObserver:45
GraphObserver
*********************************************
DigitObserver:0