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>就代表这个集合中存放了很多个观察者对象 完整代码:ConcreteObserver1ConcreteObserver2ObserverSubjectConcreteSubjectObserverPatten------------------------
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或者1static静态变量在内存中只有一个副本,如果没有static就会存在多个副本。虽然让学生和老师都继承的具体目标铃声,并且用super去访问父类变量但是,访问一次会实例化一次父类,因为用的随机数所以会导致学生和老师面对铃声做出的举动不一致。总结:必须要加static让对象共享一个副本。
原文地址:https://www.cnblogs.com/caiyu5/p/9646209.html
时间: 2024-10-18 10:58:04