目录
名词解释:
定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
现实生活举例:
农户的家里有一只穷凶极恶的猫,让家里老鼠们苦不堪言。这天,老鼠们趁着猫在午睡准备去厨房借点东西吃,并一直盯着猫,猫睡懵了,叫了一声,吓得老鼠们四散而逃。
模式解析:
猫:被观察者
老鼠:观察者(多个)
盯着:观察
叫:通知(并不是 猫真的去通知老鼠,快跑我要醒了)
四散而逃:更新操作(老鼠观察猫的动作——叫,并做出相应动作——逃跑)
代码:
1. 观察者父类
public abstract class Mouse {
protected Cat cat; //猫 被观察者
public abstract void escape(); //逃跑
}
2. 观察者子类(多个)
public class MouseA extends Mouse {
public MouseA(Cat cat) {
this.cat = cat;
this.cat.attch(this);
}
@Override
public void escape() {
System.out.println("老鼠A向东逃跑了!");
}
}
3. 被观察者
import java.util.ArrayList;
import java.util.List;
public class Cat {
private List<Mouse> mouses = new ArrayList<>();
public void attch(Mouse mouse) { // 关联
mouses.add(mouse);
}
public void meow() { // 猫叫 通知
System.out.println("猫叫");
for (Mouse mouse : mouses) {
mouse.escape();
}
}
}
4. 测试
public class Demo {
public static void main(String[] args) {
Cat cat = new Cat();
new MouseA(cat); // 老鼠A观察猫
new MouseB(cat); // 老鼠B观察猫
cat.meow(); // 猫叫
}
}
5. 运行结果
猫叫
老鼠A向东逃跑了!
老鼠B向北逃跑了!
当然,也有其他的实现形式。猫也可以添加其他的动作,老鼠也会做出相应的动作,比如:猫一跳舞,老鼠就拜年!
应用试题
1. 使用观察者模式模拟实现订阅功能。
2. 在拍卖会中,拍卖师会观察最高标价,然后通知给其他竞价者,请模拟场景。
3. 在学校里,同学们听到铃声下课出去玩,有的则放学,请模拟实现。
欢迎留言讨论,或有好的观点和建议可留言联系。