设计模式之观察者模式
发布时间:2023-12-29 09:46:21
观察者模式1. 模式定义
定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式是一种对象行为型模式。
2. 模式结构
观察者模式包含如下角色: Subject: 目标
ConcreteSubject: 具体目标 Observer: 观察者
ConcreteObserver: 具体观察者
3. 模式优缺点 模式优点:(1)可以实现表示层和数据逻辑层的分离。
(2)在观察目标和观察者之间建立一个抽象的耦合。 (3)支持广播通信,简化了一对多系统设计的难度。
(4)符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察 者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。
缺点:(1)将所有的观察者都通知到会花费很多时间。
(2)如果存在循环依赖时可能导致系统崩溃。
(3)没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知
道观察目标发生了变化。 4. 实例一
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。 实例类图
代码如下:
//抽象观察者类
public interface MyObserver {
void response(; }
//具体观察者类狗类
public class Dog implements MyObserver{
public void response( {
System.out.println("狗跟着叫!";
} }
//具体观察者类老鼠类
public class Mouse implements MyObserver{
public void response( {
System.out.println("老鼠努力逃跑!";
} }
//抽象目标类
import java.util.ArrayList; public abstract class MySubject { protected ArrayList observers = new ArrayList(; public void attach(MyObserver observer { observers.add(observer;
} public void detach(MyObserver observer { observers.remove(observer;
} //抽象的通知方法
public abstract void cry(; }
//具体目标类猫类
public class Cat extends MySubject{ public void cry( { System.out.println("猫开始叫!"; System.out