在计算机科学中,观察者模式(Observer Pattern)是一种常用的设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,观察者模式可以让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,会通知所有观察者对象,这种模式在很多场景下都非常实用,例如实时通信、数据统计等。
作为一名评测编程专家,我在实际工作中也经常使用观察者模式来解决一些问题,下面我将通过实例来详细解释观察者模式的用法和实现方法。
我们需要定义一个主题接口(Subject),它包含添加、删除和通知观察者的方法:
public interface Subject { void addObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
我们需要定义一个具体主题类(ConcreteSubject),它实现了主题接口,并提供了具体的实现方法:
import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Observer> observers; private int state; public ConcreteSubject() { observers = new ArrayList<>(); } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } public void setState(int state) { this.state = state; notifyObservers(); } }
我们需要定义一个观察者接口(Observer),它包含一个更新方法(update):
public interface Observer { void update(int state); }
我们需要定义一个具体观察者类(ConcreteObserver),它实现了观察者接口,并提供了具体的实现方法:
public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(int state) { System.out.println(name + "收到通知,状态变为:" + state); } }
我们可以在主函数中测试观察者模式的功能:
public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("观察者1"); Observer observer2 = new ConcreteObserver("观察者2"); Observer observer3 = new ConcreteObserver("观察者3"); subject.addObserver(observer1); subject.addObserver(observer2); subject.addObserver(observer3); System.out.println("当前状态:" + subject.getState()); // 所有观察者初始化状态为0,输出:当前状态:0 subject.setState(1); // 将状态改为1,输出:观察者1收到通知,状态变为:1;观察者2收到通知,状态变为:1;观察者3收到通知,状态变为:1;当前状态:1 subject.setState(2); // 将状态改为2,输出:观察者1收到通知,状态变为:2;观察者2收到通知,状态变为:2;观察者3收到通知,状态变为:2;当前状态:2 } }