说说你对观察者模式的理解?

1 个回答

  • java小王子
    遇见错的人会消耗你,遇见对的人会治愈你。
    观察者模式是一种行为型设计模式,它定义了对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式也被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 #### 优点 1. **解耦**:观察者模式将观察者与被观察者解耦,提高了系统的灵活性和可扩展性。 2. **广播通信**:被观察者向所有注册的观察者广播通知,观察者不需要了解被观察者的内部实现。 3. **符合开闭原则**:通过增加新的观察者,扩展系统功能,而不修改现有代码。 #### 缺点 1. **时间开销**:如果被观察者有很多观察者,通知所有观察者可能会花费较多时间。 2. **循环依赖**:不小心处理可能会导致观察者和被观察者之间的循环依赖,导致系统崩溃。 3. **无细节通知**:观察者模式只知道发生了变化,不知道具体变化的细节。 #### 角色 1. **Subject(抽象主题/被观察者)**:提供注册和删除观察者对象的接口。 2. **ConcreteSubject(具体主题/被观察者)**:存储具体的状态,当状态改变时通知所有的观察者。 3. **Observer(抽象观察者)**:定义一个更新接口,当被观察者状态发生变化时,更新自身。 4. **ConcreteObserver(具体观察者)**:实现抽象观察者定义的更新接口,在被观察者状态改变时,更新自身的状态。 #### 示例代码 ##### Java 实现 ```java // 抽象主题 interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObservers(); } // 具体主题 class ConcreteSubject implements Subject { private List<Observer> observers; private int state; public ConcreteSubject() { observers = new ArrayList<>(); } public void setState(int state) { this.state = state; notifyObservers(); } public int getState() { return state; } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { observers.remove(o); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 抽象观察者 interface Observer { void update(); } // 具体观察者 class ConcreteObserver implements Observer { private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject) { this.subject = subject; this.subject.registerObserver(this); } @Override public void update() { System.out.println("State updated to: " + subject.getState()); } } // 测试类 public class ObserverPatternDemo { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); subject.setState(10); subject.setState(20); } } ``` #### 应用场景 1. **事件处理系统**:如Java的事件监听机制,Spring中的事件机制。 2. **模型-视图结构**:如MVC架构,视图更新基于模型状态的变化。 3. **广播通信**:一个对象的变化需要通知其他多个对象时。 观察者模式在很多实际开发中都有应用,特别是在需要通知多个对象状态变化的场景中,使用观察者模式可以使代码更加清晰,降低耦合度,提高可维护性。
    发布于 2024-08-08 17:47 •IP属地 青海
    举报
    评论
    收藏