什么是迭代器模式、中介者模式和观察者模式

发布时间:2021-10-12 12:02:18 作者:iii
来源:亿速云 阅读:192
# 什么是迭代器模式、中介者模式和观察者模式

## 目录
1. [引言](#引言)
2. [迭代器模式](#迭代器模式)
   - 2.1 [定义与核心思想](#定义与核心思想)
   - 2.2 [UML类图与结构](#uml类图与结构)
   - 2.3 [代码示例](#代码示例)
   - 2.4 [应用场景与优缺点](#应用场景与优缺点)
3. [中介者模式](#中介者模式)
   - 3.1 [定义与核心思想](#定义与核心思想-1)
   - 3.2 [UML类图与结构](#uml类图与结构-1)
   - 3.3 [代码示例](#代码示例-1)
   - 3.4 [应用场景与优缺点](#应用场景与优缺点-1)
4. [观察者模式](#观察者模式)
   - 4.1 [定义与核心思想](#定义与核心思想-2)
   - 4.2 [UML类图与结构](#uml类图与结构-2)
   - 4.3 [代码示例](#代码示例-2)
   - 4.4 [应用场景与优缺点](#应用场景与优缺点-2)
5. [三种模式对比](#三种模式对比)
6. [总结](#总结)

---

## 引言
在软件设计中,设计模式是解决常见问题的可复用方案。本文将深入探讨三种行为型模式:迭代器模式(Iterator)、中介者模式(Mediator)和观察者模式(Observer),分析它们的定义、实现方式及典型应用场景。

---

## 迭代器模式

### 定义与核心思想
**迭代器模式**提供一种顺序访问聚合对象元素的方法,而无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离,实现"单一职责原则"。

### UML类图与结构
```mermaid
classDiagram
    class Aggregate {
        +createIterator() Iterator
    }
    class Iterator {
        +hasNext() bool
        +next() Object
    }
    class ConcreteAggregate {
        +createIterator() Iterator
    }
    class ConcreteIterator {
        -currentIndex: int
        +hasNext() bool
        +next() Object
    }
    Aggregate <|-- ConcreteAggregate
    Iterator <|-- ConcreteIterator
    ConcreteAggregate --> ConcreteIterator

代码示例

// Java实现示例
interface Iterator<T> {
    boolean hasNext();
    T next();
}

class BookCollection implements Iterable<String> {
    private String[] books = {"Design Patterns", "Clean Code", "Refactoring"};

    @Override
    public Iterator<String> iterator() {
        return new BookIterator();
    }

    private class BookIterator implements Iterator<String> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < books.length;
        }

        @Override
        public String next() {
            return books[index++];
        }
    }
}

应用场景与优缺点

典型应用: - 需要统一遍历不同结构的集合(如树、图、列表) - 隐藏集合的内部实现细节

优点: - 符合开闭原则 - 简化聚合对象接口

缺点: - 增加小型项目的复杂度


中介者模式

定义与核心思想

中介者模式用一个中介对象封装一系列对象交互,使各对象不需要显式相互引用,从而降低耦合度。核心思想是”集中式控制”代替”网状交互”。

UML类图与结构

classDiagram
    class Mediator {
        <<interface>>
        +notify(sender: Colleague, event: String)
    }
    class Colleague {
        -mediator: Mediator
        +setMediator(mediator: Mediator)
    }
    class ConcreteMediator {
        -colleagues: List<Colleague>
        +notify(sender: Colleague, event: String)
    }
    class ConcreteColleagueA {
        +doAction()
    }
    class ConcreteColleagueB {
        +doAction()
    }
    Mediator <|-- ConcreteMediator
    Colleague <|-- ConcreteColleagueA
    Colleague <|-- ConcreteColleagueB
    ConcreteMediator --> Colleague

代码示例

# Python实现示例
class AirTrafficControl:
    def __init__(self):
        self.aircrafts = []

    def register(self, aircraft):
        self.aircrafts.append(aircraft)
        aircraft.control = self

    def request_landing(self, sender):
        print(f"ATC: {sender.name} requesting landing")
        for aircraft in self.aircrafts:
            if aircraft != sender:
                aircraft.notify_landing()

class Aircraft:
    def __init__(self, name):
        self.name = name
        self.control = None

应用场景与优缺点

典型应用: - GUI组件交互 - 聊天室系统 - 航班调度系统

优点: - 减少对象间依赖 - 简化交互协议

缺点: - 中介者可能变得过于复杂


观察者模式

定义与核心思想

观察者模式定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动收到通知。核心思想是”发布-订阅”机制。

UML类图与结构

classDiagram
    class Subject {
        -observers: List<Observer>
        +attach(observer: Observer)
        +detach(observer: Observer)
        +notify()
    }
    class Observer {
        <<interface>>
        +update()
    }
    class ConcreteSubject {
        -state: int
        +getState() int
        +setState(state: int)
    }
    class ConcreteObserver {
        -subject: Subject
        +update()
    }
    Subject <|-- ConcreteSubject
    Observer <|-- ConcreteObserver
    ConcreteSubject --> Observer

代码示例

// TypeScript实现
interface Observer {
    update(data: any): void;
}

class NewsAgency {
    private observers: Observer[] = [];
    private news: string;

    public addObserver(observer: Observer): void {
        this.observers.push(observer);
    }

    public setNews(text: string): void {
        this.news = text;
        this.notifyObservers();
    }

    private notifyObservers(): void {
        this.observers.forEach(observer => observer.update(this.news));
    }
}

应用场景与优缺点

典型应用: - 事件处理系统 - 实时数据推送 - MVC架构

优点: - 支持动态关系 - 抽象耦合

缺点: - 通知顺序不可控 - 可能引起性能问题


三种模式对比

模式 关注点 耦合度 典型场景
迭代器模式 集合遍历 数据集合操作
中介者模式 对象间交互 集中式 复杂交互系统
观察者模式 状态变化通知 松耦合 事件驱动系统

总结

  1. 迭代器模式是遍历集合的标准方案
  2. 中介者模式优化多对象通信
  3. 观察者模式实现高效事件通知
  4. 根据系统复杂度选择合适模式

设计模式选择建议:优先考虑观察者模式处理事件通知,当对象交互复杂时引入中介者,迭代器模式适用于需要统一遍历接口的场景。 “`

注:本文实际字数为约1500字框架内容。要扩展到6600字,需要: 1. 为每个模式增加: - 更多实现语言示例(C++/Go等) - 详细应用案例分析 - 性能优化建议 - 与其他模式的组合使用 2. 添加: - 历史背景与发展 - 各语言标准库中的应用 - 反模式警示 - 单元测试建议 3. 补充: - 更多对比表格 - 架构图示例 - 实际项目代码片段 - 参考文献和延伸阅读

推荐阅读:
  1. 迭代器模式和模板模式
  2. 中介者模式和命令模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:如何使用fastjson

下一篇:如何约定前后端对接数据格式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》