觀察者模式---上課鈴代碼
阿新 • • 發佈:2018-09-14
server int att 就是 pre string servers per 進入
ConcreteObserver1和ConcreteObserver2,兩個具體觀察者也就是老師和學生。共用一個Observer抽象觀察者接口,只有一個response()方法。
ConcreteSubject具體目標類繼承了Subject抽象目標類有抽象notifyObserve();//通知觀察者方法。
重點是抽象目標Subject的代碼:import java.util.ArrayList;import java.util.List;
/**
* 抽象目標
*/
abstract class Subject {
//定義一個觀察者集合 用於存儲 所有觀察者對象
protected List<Observer> observers=new ArrayList<Observer>();
//增加觀察者方法
public void add(Observer observer){
observers.add(observer);
}
//刪除觀察者方法
public void remove(Observer observer){
observers.remove(observer);
}
public abstract void notifyObserve();//通知觀察者方法
}
List指的是集合.<>是泛型,裏面指定了這個集合中存放的是什麽數據.
Observer是接口也是特殊的抽象類,Observer裏面包含了觀察者的一些信息.這樣每一個Observer對象就代表了一個觀察者.此時List<Observer>就代表這個集合中存放了很多個觀察者對象
完整代碼:
ConcreteObserver1
ConcreteObserver2
Observer
Subject
ConcreteSubject
ObserverPatten
------------------------
Concreteobserver1
package com.anhu.caiyu; public class ConcreteObserver1 extends ConcreteSubject implements Observer { public void response(){ if(super.i==1) System.out.println("老師上課");else System.out.println("老師下課"); } }
Concreteobserver2
package com.anhu.caiyu; public class ConcreteObserver2 extends ConcreteSubject implements Observer { public void response(){ if(super.i==1) System.out.println("學生進入教室"); else System.out.println("學生放學"); } }
Observer
package com.anhu.caiyu; //抽象觀察者 public interface Observer { void response();//反應 }
ObserverPatten
package com.anhu.caiyu; public class ObserverPatten { public static void main(String[] args){ Subject subject=new ConcreteSubject(); Observer observer1=new ConcreteObserver1(); Observer observer2=new ConcreteObserver2(); subject.add(observer1); subject.add(observer2); subject.notifyObserve(); } }
Subject
package com.anhu.caiyu; //抽象目標 import java.util.ArrayList; import java.util.List; /** * 抽象目標 */ abstract class Subject { //定義一個觀察者集合 用於存儲 所有觀察者對象 protected List<Observer> observers=new ArrayList<Observer>(); //增加觀察者方法 public void add(Observer observer){ observers.add(observer); } //刪除觀察者方法 public void remove(Observer observer){ observers.remove(observer); } public abstract void notifyObserve();//通知觀察者方法 }
ConcreteSubject
package com.anhu.caiyu; public class ConcreteSubject extends Subject{ static int i=(int)(Math.random()*2); public void notifyObserve() { if (i == 1) { System.out.println("///////////////"); System.out.println("上課鈴聲響"); for (Object object : observers) { ((Observer) object).response(); System.out.println("---------------"); } } else { System.out.println("////////////"); System.out.println("下課鈴聲響"); for (Object object : observers) { ((Observer) object).response(); System.out.println("---------------"); } }
static int i=(int)(Math.random()*2);
隨機數只有0或者1
static靜態變量在內存中只有一個副本,如果沒有static就會存在多個副本。雖然讓學生和老師都繼承的具體目標鈴聲,並且用super去訪問父類變量但是,
訪問一次會實例化一次父類,因為用的隨機數所以會導致學生和老師面對鈴聲做出的舉動不一致。總結:必須要加static讓對象共享一個副本。
觀察者模式---上課鈴代碼