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

1.概念java

定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。ide

2.適用性測試

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

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

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

3.參與者blog

(1).Subject(目標) 接口

     目標知道它的觀察者。能夠有任意多個觀察者觀察同一個目標。      提供註冊和刪除觀察者對象的接口。   rem

(2).Observer(觀察者)get

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

 (3).ConcreteSubject(具體目標) 

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

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

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

4.示例:

package com.accp.Observer;

/**
 * 主題(被觀察的東西)
 * @author Administrator
 *
 */
public interface Subject {

 public void addObserver(Observer observer);
 
 public void removeObserver(Observer observer);
}

package com.accp.Observer;

/**
 * 觀察者接口
 * @author Administrator
 *
 */
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;
/**
 * 具體目標
 * @author Administrator
 *
 */
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;
/**
 * 測試
 * @author Administrator
 *
 */
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();  } }

相關文章
相關標籤/搜索