- 举例
- 设计模式中的角色
- 观察者
- 被观察者
- 观察者管理器
- 观察者模式使用场景
- 示例
- 抽象观察方法
- 设定三个观察者:学生、老师、厨师
- 学生
- 老师
- 厨师
- 观察者管理器
- 测试执行和执行结果
以学校为例,学校中有学生、老师、校长、小餐厅厨师等角色,以学校铃声+时间作为角色监听事件。学校九点铃声,学生、老师、厨师到学校,校长不需要关注此铃声;学校十一点铃声,只有厨师关注此铃声,需要做饭;学校十二点铃声,学生、老师、校长到餐厅吃饭。
设计模式中的角色观察者和被观察者。
观察者示例中的学生、老师、校长、厨师都是观察者,观察铃声+当前时间。
被观察者示例中的铃声+时间就是被观察者。
观察者管理器观察者的数量不确认,因此需要观察者管理器保存所有的观察者,由观察者管理器监听事件,观察者管理器根据监听事件遍历执行观察者方法。
观察者模式使用场景简单观察者属于同步执行监听方法。
使用观察者模式,属于多动脑子,少些代码。将冗余代码抽离,优化代码结构。
public interface Observe {
void observeVoice(int hour);
}
设定三个观察者:学生、老师、厨师
学生
public class StudentObserver implements Observe {
@Override
public void observeVoice(int hour) {
if (hour == 9) {
System.out.println("student go school");
return;
}
if (hour == 12) {
System.out.println("student eat");
return;
}
if (hour == 18) {
System.out.println("student go home");
return;
}
System.out.println("student do nothing");
}
}
老师
public class TeacherObserver implements Observe{
@Override
public void observeVoice(int hour) {
if (hour == 9) {
System.out.println("teacher go school");
return;
}
if (hour == 12) {
System.out.println("teacher eat");
return;
}
if (hour == 18) {
System.out.println("teacher go home");
return;
}
if (hour == 20) {
System.out.println("teacher study");
return;
}
System.out.println("teacher do nothing");
}
}
厨师
public class ChefObserver implements Observe {
@Override
public void observeVoice(int hour) {
if (hour == 12) {
System.out.println("chef help student and teacher eat");
return;
}
if (hour == 14) {
System.out.println("chef do dishes");
return;
}
System.out.println("chef do nothing");
}
}
观察者管理器
public class ObserverManager implements Observe {
private List observes;
// 可以自定义移除方法
public void addObserver(Observe observe) {
if (this.observes == null) {
this.observes = new ArrayList<>();
}
this.observes.add(observe);
}
@Override
public void observeVoice(int hour) {
this.observes.forEach(item -> item.observeVoice(hour));
}
}
测试执行和执行结果
public class TestOberver {
public static void main(String[] args) {
ObserverManager manager = new ObserverManager();
manager.addObserver(new StudentObserver());
manager.addObserver(new TeacherObserver());
manager.addObserver(new ChefObserver());
manager.observeVoice(9);
System.out.println("-------");
manager.observeVoice(10);
System.out.println("-------");
manager.observeVoice(12);
}
}



