名词解释:
定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
现实生活举例:
农户的家里有一只穷凶极恶的猫,让家里老鼠们苦不堪言。这天,老鼠们趁着猫在午睡准备去厨房借点东西吃,并一直盯着猫,猫睡懵了,叫了一声,吓得老鼠们四散而逃。
模式解析:
猫:被观察者
老鼠:观察者(多个)
盯着:观察
叫:通知(并不是 猫真的去通知老鼠,快跑我要醒了)
四散而逃:更新操作(老鼠观察猫的动作——叫,并做出相应动作——逃跑)
代码:
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. 在学校里,同学们听到铃声下课出去玩,有的则放学,请模拟实现。
欢迎留言讨论,或有好的观点和建议可留言联系。