Java设计模式-观察者模式

来源:互联网 发布:customrules.js 编辑:程序博客网 时间:2024/06/03 17:50

1、概念

观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动更新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口。

2、代码实现

1、Java默认实现

/**  * 被观察者 */  class Food extends Observable {      /** 菜价 */      private float price;      public Food(float price) {          this.price = price;      }     public float getPrice() {          return price;      }      public void setPrice(float price) {          this.price = price;          //核心代码        this.setChanged();          /**          *通知所有注册者,并回调Observer的update方法         */          this.notifyObservers(price);      }  } 
/**  * 顾客 --观察者  */  class Customer implements Observer {      //重写update方法    @Override      public void update(Observable o, Object arg) {          if (o instanceof Food && arg instanceof Float) {              Food food = (Food) o;              float price = (Float) arg;              System.out.println(price);          }    }}  
/**  * 测试类  */  public class Test {      public static void main(String[] args) {          Food food = new Food(1.0f);          Customer customer1 = new Customer();          Customer customer2 = new Customer();          //注册          food.addObserver(customer1);          food.addObserver(customer2);          food.setPrice(1.5f);      }  }  

2、自实现观察者模式

//抽象的观察者public interface Watcher  {       public void update();  }  
//抽象的被观察者public interface Watched  {       public void addWatcher(Watcher watcher);       public void removeWatcher(Watcher watcher);       public void notifyWatchers();  }  

3个观察者

public class Security implements Watcher  {       @Override       public void update()       {            System.out.println("Security");       }  } public class Thief implements Watcher  {       @Override       public void update()       {            System.out.println("Thief");       }  }public class Police implements Watcher  {       @Override       public void update()       {            System.out.println("Police");       }  } 

被观察者实现

public class Transporter implements Watched  {       private List<Watcher> list = new ArrayList<Watcher>();       @Override       public void addWatcher(Watcher watcher)       {            list.add(watcher);       }       @Override       public void removeWatcher(Watcher watcher)       {            list.remove(watcher);       }       @Override       public void notifyWatchers(String str)       {            for (Watcher watcher : list)            {                 watcher.update();            }       }} 
//测试类public class Test  {       public static void main(String[] args)       {            Transporter transporter = new Transporter();            Police police = new Police();            Security security = new Security();            Thief thief = new Thief();            transporter.addWatcher(police);            transporter.addWatcher(security);            transporter.addWatcher(security);            transporter.notifyWatchers();       }  }

这里这是简单的自定义观察者模式,其中观察者模式分为推模型和拉模型。

(1)推模型
被观察者对象向观察者推送详细信息,不管观察者是否需要,推送的信息通常是被观察者对象的全部或部分数据。

(2)拉模型
被观察者对象在通知观察者的时候,只传递少量信息,如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。一般这种模型的实现中,会把被观察者对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。

拉模式的抽象观察者

public interface Observer {    /**     * 更新接口     * @param subject 传入被观察者对象,方便获取相应的主题对象的状态     */    public void update(Observable observable);}
原创粉丝点击