返回

迭代器模式和观察者模式关系亲密,迭代器模式给观察者模式“推波助澜”

前端

推(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()方法,更新自己的显示。

观察者模式迭代器模式 都是非常有用的设计模式,它们可以帮助我们编写出更灵活和可维护的代码。