文章目录
核心设计
- 一个 subject 里面聚合了一个观察者的列表,你可以把这个 subject 看做是目标对象,也就是观察者的观察对象
- 观察者也把 subject 作为一个属性
- subject 中的某个行为会触发观察者的某些行为
- observer 设计成抽象类是为了扩展,可以产生很多不同的观察者,都观察这个 subject
类图
案例代码
- subject 是一个厨师
- obeserver 分两种:端茶 observer 和 上菜 observer
- 每次厨师做好一个菜,端茶的就去端茶,上菜的就去上菜
package 设计模式.观察者模式;
public abstract class Observer {
protected String name;
protected Subject subject;
public Observer(String name, Subject subject){
this.subject = subject;
this.name = name;
}
public abstract void delivery();
public abstract void makeTea();
}
package 设计模式.观察者模式;
public class ObserverNoodles extends Observer {
public ObserverNoodles(String name, Subject subject) {
super(name, subject);
}
@Override
public void delivery() {
System.out.println(name + " delicious food is delivering");
}
@Override
public void makeTea() {
}
}
package 设计模式.观察者模式;
public class ObserverTeaMaker extends Observer {
public ObserverTeaMaker(String name, Subject subject) {
super(name, subject);
}
@Override
public void delivery() {
}
@Override
public void makeTea() {
System.out.println(this.name + " is making tea for client");
}
}
package 设计模式.观察者模式;
import javafx.beans.binding.Objectexpression;
import java.util.ArrayList;
public class Subject {
private String name="chef";
private ArrayList observers = new ArrayList<>();
public Subject(){
observers.add(new ObserverNoodles("noodleDeliver",this));
observers.add(new ObserverTeaMaker("teaMaker",this));
}
public void cook(){
System.out.println("chef is making delicious food!!");
noticeAllObserver();
}
public void noticeAllObserver(){
for (Observer obs :
observers) {
if (obs instanceof ObserverNoodles) {
obs.delivery();
}
else {
obs.makeTea();
}
}
}
}
package 设计模式.观察者模式;
public class Demo {
public static void main(String[] args) {
Subject chef = new Subject();
chef.cook();
}
}