java实现观察者(Observer)模式

    技术2024-04-23  182

    观察者模式:

     

    将观察者与被观察着的对象分离,在模块之间进行区分,提高了程序的重用性、可维护性。

     

    用代码实现时,观察者与被观察者之间的关系不能是直接调用,而应该是一种 注册回调 的形式。

    观察者实现一个接口,被观察者保存注册过的观察者的信息,当发生变化时,通过多态回调观察者的接口方法。

     

    package Test;

     

    import java.util.HashSet;

    public class ObserverTry { public static void main(String[] args){  Index i = new Index("数据指数",150);  Observer o1 = new AObserver();  Observer o2 = new BObserver();  i.addObserver(o1);  //注册观察者  i.addObserver(o2);  System.out.println(" Count Up! ");  i.setCount(180);  o1.remove(i);  //观察者o1取消观察  System.out.println(" Count Down! ");  i.setCount(120); }}

    interface Observer{ public void update(Index i); //更新index public void remove(Index i); //撤销注册}

    class AObserver implements Observer{ public void update(Index i){  System.out.println("A  Name: " + i.getName() + "  Count: " + i.getCount()); } public void remove(Index i){  i.getObservers().remove(this); }}

    class BObserver implements Observer{ public void update(Index i){  System.out.println("B  Name: " + i.getName() + "  Count: " + i.getCount()); } public void remove(Index i){  i.getObservers().remove(this); }}

    class Index{ private String name; private int count; private HashSet<Observer> observers; //保存所有的观察者  public Index(String name,int count){  this.name = name;  this.count = count;  observers = new HashSet<Observer>(); }  public void addObserver(Observer ob){  observers.add(ob); //添加观察者 }  public void notifyObserver(){  for(Observer ob:observers){   ob.update(this); //回调所有观察者的update方法  } }  public String getName() {  return name; }

     public void setName(String name) {  this.name = name; }

     public int getCount() {  return count; }

     public void setCount(int count) {  this.count = count;  notifyObserver();  //当count改变时,通知观察者 }  public HashSet<Observer> getObservers() {  return observers; }

     public void setObservers(HashSet<Observer> observers) {  this.observers = observers; }}

    最新回复(0)