天天看點

java設計模式-----觀察者模式

1.概念

定義對象間的一種一對多的依賴關系,當一個對象的狀态發生改變時,所有依賴于它的對象都得到通知并被自動更新。

2.适用性

(1).當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。   将這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。 

(2).當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。   

(3)..當一個對象必須通知其它對象,而它又不能假定其它對象是誰。

3.參與者

(1).Subject(目标) 

     目标知道它的觀察者。可以有任意多個觀察者觀察同一個目标。      提供注冊和删除觀察者對象的接口。   

(2).Observer(觀察者)

      為那些在目标發生改變時需獲得通知的對象定義一個更新接口。  

 (3).ConcreteSubject(具體目标) 

     将有關狀态存入各ConcreteObserver對象。      當它的狀态發生改變時,向它的各個觀察者發出通知。

 (4).ConcreteObserver(具體觀察者)    

  維護一個指向ConcreteSubject對象的引用。      存儲有關狀态,這些狀态應與目标的狀态保持一緻。      實作Observer的更新接口以使自身狀态與目标的狀态保持一緻

4.示例:

package com.accp.Observer;

public interface Subject {

 public void addObserver(Observer observer);

 public void removeObserver(Observer observer);

}

package com.accp.Observer;

public interface Observer {

 public void update();

}

package com.accp.Observer;

import java.util.ArrayList;

import java.util.List;

//具體觀察者

public class Cat implements Subject {

 private List<Observer> list = new ArrayList<Observer>();

 @Override

 public void addObserver(Observer observer) {

  list.add(observer);

 }

 @Override

 public void removeObserver(Observer observer) {

  list.remove(observer);

 }

 public void crawl() {

  System.out.println("貓叫了...");

  for(Observer ob : list) {

   ob.update();

  }

 }

}

package com.accp.Observer;

public class Mouse implements Observer {

 public void runAway() {

  System.out.println("老鼠逃跑了...");

 }

 @Override

 public void update() {

  runAway();

 }

}

package com.accp.Observer;

public class Person implements Observer {

 public void awake() {

  System.out.println("人醒了...");

 }

 @Override

 public void update() {

  awake();

 }

}

package com.accp.Observer;

public class Test01 {

 public static void main(String[] args) {

  Cat c = new Cat();

  Person p = new Person();

  Mouse m1 = new Mouse();

  Mouse m2 = new Mouse();

  c.addObserver(m1);

  c.addObserver(p);

  c.addObserver(m2);

  c.crawl();

 }

}

繼續閱讀