觀察者模式JAVA版---上課鈴代碼

ConcreteObserver1和ConcreteObserver2,兩個具體觀察者也就是老師和學生。共用一個Observer抽象觀察者接口,只有一個response()方法。

ConcreteSubject具體目標類繼承了Subject抽象目標類有抽象notifyObserve();//通知觀察者方法。

重點是抽象目標Subject的代碼:import java.util.ArrayList;import java.util.List;

/**

  • 抽象目標
    */
    abstract class Subject {
    //定義一個觀察者集合 用於存儲 所有觀察者對象
    protected List observers=new ArrayList();
    //增加觀察者方法
    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就代表這個集合中存放了很多個觀察者對象

完整代碼:
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讓對象共享一個副本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章