观察者模式---上课铃代码

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让对象共享一个副本。
 

猜你喜欢

转载自www.cnblogs.com/caiyu5/p/9646209.html