一、 问题描述
实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。
二、 完成如下题目要求
-
画出静态图
-
写出采用该设计模式的好处
观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。
这样,我们增加观察者(这里可以理解成一个新的公告板),就不需要去修改核心类WeatherData不会修改代码,遵守开放封闭原则。
- 编写代码
package observer;
//客户端
public class Client {
public static void main(String[] args) {
Spy spy=new Spy();
StudentA studentA =new StudentA();
StudentB studentB=new StudentB();
spy.registerObserver(studentA);
spy.registerObserver(studentB);
studentA.display();
studentB.display();
System.out.println("==========");
spy.setStatus("老师来了");
}
}
package observer;
//主题
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
package observer;
import java.util.ArrayList;
public class Spy implements Subject {
String status="";
ArrayList<Observer> observers;
//构造方法
public Spy() {
observers=new ArrayList<Observer>();
}
// 更新状态
public void setStatus(String status) {
this.status = status;
notifyObservers();
}
// 登记observer
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
// 移除Observer
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
// 通知所有observers
@Override
public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update(status);
}
}
}
package observer;
//观察者抽象
public interface Observer {
public void update(String status);
}
package observer;
public class StudentA implements Observer{
String status="游戏中";
@Override
public void update(String status) {
this.status=status;
display();
}
public void display() {
if(status.equals("老师来了")) {
System.out.println(status+","+"A君关闭游戏,继续编程");
}else {
System.out.println("A君"+status);
}
}
}
package observer;
public class StudentB implements Observer{
String status="游戏中";
@Override
public void update(String status) {
this.status=status;
display();
}
public void display() {
if(status.equals("老师来了")) {
System.out.println(status+","+"B君关闭游戏,继续编程");
}else {
System.out.println("B君"+status);
}
}
}