设计模式之观察者模式

发布时间: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.println("---------------------"; for(Object obs:observers { ((MyObserverobs.response(; } } }

//测试类
public class Test { public static void main(String[] args { MySubject subject = new Cat(; MyObserver observer1,observer2,observer3; observer1 = new Mouse(; observer2 = new Pig(; observer3 = new Dog(;

subject.attach(observer1; subject.attach(observer2; subject.attach(observer3;

subject.cry(; } }

设计模式之观察者模式

相关推荐