迭代器模式和观察者模式关系亲密,迭代器模式给观察者模式“推波助澜”
2024-02-03 21:55:26
推(push)和拉(pull)是我们在日常生活中经常会遇到的两个动作,我们常见的倒水就是推的典型代表,我们用手把杯子推下去,水就会流出来。拉的典型代表就是从水井里打水,我们用手把水桶拉上来,水就出来了。
在软件开发领域,推和拉也可以用在数据传输中。推 是一种数据生产者主动将数据发送给数据消费者的数据传输方式,而拉 是一种数据消费者主动向数据生产者请求数据的传输方式。在现实中,push和pull方式的数据传输方式都十分常见,例如QQ就采用了push方式,当新消息来的时候,QQ服务器主动将新消息推送到客户端。而微信则是采用的pull方式,用户需要主动请求微信服务器去获取新消息。
观察者模式 是一种设计模式,它允许对象订阅其他对象,并在被订阅对象发生改变时得到通知。在观察者模式中,被订阅的对象称为“被观察者”,而订阅其他对象的对象称为“观察者”。
迭代器模式 是一种设计模式,它允许对象遍历集合中的元素,而无需知道集合的内部结构。在迭代器模式中,遍历集合的对象称为“迭代器”,而被遍历的集合称为“聚合”。
观察者模式 和迭代器模式 都是非常有用的设计模式,它们可以帮助我们编写出更灵活和可维护的代码。
举个例子,假设我们有一个程序,它需要显示一个集合中的所有元素。我们可以使用迭代器模式来遍历集合中的元素,并使用观察者模式来在集合发生改变时更新显示。
当我们使用迭代器模式时,我们不需要知道集合的内部结构。我们可以使用迭代器来遍历集合中的元素,而无需关心集合是如何存储的。这使得我们可以很容易地更改集合的存储方式,而无需更改遍历集合的代码。
当我们使用观察者模式时,我们可以很容易地向集合添加和删除元素。当集合发生改变时,观察者会自动收到通知,并更新显示。这使得我们可以很容易地保持显示与集合同步。
// 被观察者接口
interface Observable {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
interface Observer {
void update(Observable observable);
}
// 具体被观察者类
class ConcreteObservable implements Observable {
private List<Observer> 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(this);
}
}
// 模拟数据发生改变
public void changeData() {
notifyObservers();
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
@Override
public void update(Observable observable) {
// 更新显示
System.out.println("数据发生改变,更新显示...");
}
}
public class Main {
public static void main(String[] args) {
// 创建被观察者对象
Observable observable = new ConcreteObservable();
// 创建观察者对象
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();
// 将观察者添加到被观察者中
observable.addObserver(observer1);
observable.addObserver(observer2);
// 模拟数据发生改变
observable.changeData();
}
}
在上面的例子中,ConcreteObservable
类是被观察者 ,它实现了Observable
接口。ConcreteObserver
类是观察者 ,它实现了Observer
接口。
当ConcreteObservable
类中的数据发生改变时,它会调用notifyObservers()
方法,通知所有的观察者。观察者收到通知后,会调用update()
方法,更新自己的显示。
观察者模式 和迭代器模式 都是非常有用的设计模式,它们可以帮助我们编写出更灵活和可维护的代码。