java设计模式-----观察者模式-LMLPHP

1.概念

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2.适用性

(1).当一个抽象模型有两个方面,其中一个方面依赖于另一方面。   将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 

(2).当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。   

(3)..当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

3.参与者

(1).Subject(目标) 

     目标知道它的观察者。可以有任意多个观察者观察同一个目标。      提供注册和删除观察者对象的接口。   

(2).Observer(观察者)

      为那些在目标发生改变时需获得通知的对象定义一个更新接口。  

 (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();
 }
}

 
 

06-29 18:45