设计模式探秘:迭代器模式与访问者模式详解

全文目录:

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

目录

  1. 前言:设计模式的奥秘🤔
  2. [迭代器模式:你的数据管家 📜](#迭代器模式:你的数据管家 📜)
  3. [访问者模式:行为的游牧者 🌍](#访问者模式:行为的游牧者 🌍)
  4. [迭代器模式 VS 访问者模式 🔍](#迭代器模式 VS 访问者模式 🔍)
  5. [总结:掌握设计模式的小贴士 🎓](#总结:掌握设计模式的小贴士 🎓)

前言:设计模式的奥秘🤔

如果你是软件开发者,一定听过"设计模式"这个词。没错!它们就是那些在代码中重复出现的"套路",是我们程序员解题的小法宝。但设计模式就像是武林秘籍,需要深刻理解后才能运用自如。本篇文章将深入探讨两种行为型设计模式:迭代器模式访问者模式。无论是管理数据集合,还是处理不同对象的操作,这两种模式都有它们独特的优势。准备好了吗?让我们一起来探索这些模式的精髓吧!


迭代器模式:你的数据管家 📜

什么是迭代器模式?

迭代器模式(Iterator Pattern)是一种行为型设计模式,提供了一种可以顺序访问集合对象内部元素的方法,而无需暴露该集合的内部表示。想象一下,你有一堆书,但你不想自己一本本翻阅,而是请了一个图书管理员,他帮你一本一本地递给你,这就是迭代器模式的本质!

迭代器模式的核心要点

  1. 提供统一的访问接口:不需要了解集合内部结构,即可逐个访问元素。
  2. 解耦集合和遍历算法:遍历算法和集合本身分离,符合"单一职责原则"。
  3. 支持不同类型的集合:无论是数组、列表还是树结构,都可以实现迭代器。

迭代器模式的实现示例

我们来用Java实现一个简单的迭代器模式。假设我们有一个"书架"集合,并希望可以通过迭代器来遍历其中的书籍:

java 复制代码
// 书籍类
class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}

// 迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

// 书架类
class BookShelf {
    private List<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    public Iterator iterator() {
        return new BookShelfIterator(this);
    }

    public List<Book> getBooks() {
        return books;
    }
}

// 书架的迭代器
class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    public boolean hasNext() {
        return index < bookShelf.getBooks().size();
    }

    public Book next() {
        return bookShelf.getBooks().get(index++);
    }
}

使用这个迭代器,我们可以这样遍历书架:

java 复制代码
BookShelf bookShelf = new BookShelf();
bookShelf.addBook(new Book("设计模式"));
bookShelf.addBook(new Book("算法导论"));

Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()) {
    Book book = (Book) iterator.next();
    System.out.println("书名:" + book.getTitle());
}

迭代器模式的优缺点

优点

  • 简化集合对象的遍历,解耦了数据结构和遍历逻辑。
  • 可以提供多种遍历方式,扩展性好。

缺点

  • 增加了类的数量,代码可能变得复杂。
  • 不支持反向遍历(需要额外实现)。

访问者模式:行为的游牧者 🌍

什么是访问者模式?

访问者模式(Visitor Pattern)是一种行为型设计模式,用于在不修改现有类的前提下,向这些类添加新的操作。它允许我们定义新的操作,而无需更改每个对象的类结构。举个例子,如果你是考古学家,博物馆里的文物就是你的对象,而考古学家的各种研究手段就是"访问者",不同的研究手段作用于同样的文物,就能得出不同的结论。

访问者模式的核心要点

  1. 分离操作和数据结构:访问者模式将数据结构与行为分离,使得新的行为可以独立扩展。
  2. 双重分派:访问者模式依赖于双重分派,即由具体的元素决定访问者该执行什么操作。
  3. 新增操作不影响数据结构:不需要修改数据结构即可添加新的操作。

访问者模式的实现示例

假设我们有一组不同类型的电脑硬件(CPU、显卡等),我们希望能对这些硬件执行不同的操作,如检查性能、获取价格等。这时就可以用访问者模式:

java 复制代码
// 访问者接口
interface Visitor {
    void visit(CPU cpu);
    void visit(GPU gpu);
}

// 硬件接口
interface Hardware {
    void accept(Visitor visitor);
}

// CPU类
class CPU implements Hardware {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String getCPUName() {
        return "Intel i7";
    }
}

// GPU类
class GPU implements Hardware {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String getGPUName() {
        return "NVIDIA GTX 3080";
    }
}

// 性能检查访问者
class PerformanceVisitor implements Visitor {
    public void visit(CPU cpu) {
        System.out.println("检查CPU性能: " + cpu.getCPUName());
    }

    public void visit(GPU gpu) {
        System.out.println("检查GPU性能: " + gpu.getGPUName());
    }
}

使用访问者模式,我们可以很方便地添加新的操作而不影响硬件类本身:

java 复制代码
Hardware cpu = new CPU();
Hardware gpu = new GPU();
Visitor performanceVisitor = new PerformanceVisitor();

cpu.accept(performanceVisitor);
gpu.accept(performanceVisitor);

访问者模式的优缺点

优点

  • 符合开闭原则,新增操作不影响原有数据结构。
  • 简化了复杂对象结构中不同操作的添加。

缺点

  • 对于增加新的数据结构不友好,需要修改每个访问者。
  • 破坏了封装性,访问者可能需要访问对象的内部细节。

迭代器模式 VS 访问者模式 🔍

迭代器模式和访问者模式虽然都是行为型模式,但解决的问题截然不同。迭代器模式关注的是如何遍历数据集合 ,而访问者模式则关心如何在不修改类结构的情况下添加新操作。可以说,迭代器模式是你的"数据管家",而访问者模式是你数据的"行为游牧者"。


总结:掌握设计模式的小贴士 🎓

设计模式的学习不是一蹴而就的,它需要我们在实际开发中不断应用和总结。迭代器模式帮助我们优雅地遍历集合,而访问者模式则为复杂对象结构中的操作扩展提供了便捷。掌握这些模式,可以让你的代码更具弹性和复用性,真正成为开发中的"小助手"!

希望通过本文,你对迭代器模式和访问者模式有了更深的理解。设计模式的世界还很大,我们一起探索吧!

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

相关推荐
西岭千秋雪_7 小时前
设计模式の单例&工厂&原型模式
java·单例模式·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·原型模式
m0_748251729 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
fuvuof11 小时前
设计模式——单例模式和工厂模式
python·单例模式·设计模式
岳轩子15 小时前
23种设计模式之备忘录模式
windows·设计模式·备忘录模式
岳轩子15 小时前
23种设计模式之中介者模式
设计模式·中介者模式
Vincent(朱志强)18 小时前
设计模式详解(十):策略模式——Strategy
设计模式·策略模式
WangMing_X19 小时前
C# 23种设计模式(1)单例模式(单件模式)
单例模式·设计模式
wkj00119 小时前
PHP开发设计模式:单例模式
单例模式·设计模式·php
不爱吃米饭_20 小时前
工作中常用的8种设计模式
设计模式
岳轩子21 小时前
23种设计模式之命令模式
设计模式·命令模式