目录
I. 简介
II. 封装VS不封装
III. 封装遍历的函数设计
A. 未封装
B.封装
(1)封装需要考虑什么
(2)代码实现
Iterator
例1(链表)
例2(二叉树)
Comsumer
IV. 封装遍历的性能优化
V. 总结
I. 简介
封装遍历的优势包括提高代码的可重用性、可测试性和可维护性。它使得功能可以独立于具体的应用场景进行开发和调试,并且可以在不同的项目和模块中共享和重用。
下文我们将针对遍历函数loop()进行封装方法的探究和比较
II. 封装VS不封装
优点:
- 封装性强:将遍历和查找功能封装在同一个类中,可以将相关的方法和数据组织在一起,提高代码的可读性和维护性。
- 代码复用性高:将遍历和查找功能放在同一个类中,可以在不同的场景下复用这些功能,减少代码的重复编写。
- 内聚性增强:将相关的功能放在同一个类中,可以增强类的内聚性,使得类的设计更加一致和清晰。
缺点:
- 类的职责不清晰:将遍历和查找功能放在同一个类中,可能导致类的职责不够单一,造成类的设计模糊和复杂化。
- 类的大小增加:将多个功能放在同一个类中,会增加类的大小和复杂性,使得类的维护和测试变得更加困难。
- 可扩展性受限:如果以后需要添加其他类型的功能,可能会导致类的功能越来越臃肿,增加代码的复杂性。
III. 封装遍历的函数设计
A. 未封装
如果不进行封装,我们进行遍历查找一般通过index或者手动输入node进行访问,如下面的例子
//二叉树的遍历 public void preOrder(BinNodePtr node) { if (node != null) { System.out.println(node); preOrder(node.getLeft()); preOrder(node.getRight()); } else return; } //链表的遍历 public static void traverseLinkedList(ListNode head) { ListNode current = head; while (current != null) { System.out.println(current.val); current = current.next; } } //数组的遍历 public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; // 使用普通for循环遍历数组 System.out.println("使用普通for循环遍历数组:"); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } // 使用增强for循环遍历数组 System.out.println("使用增强for循环遍历数组:"); for (int num : arr) { System.out.println(num); } // 使用流式操作遍历数组 System.out.println("使用流式操作遍历数组:"); Arrays.stream(arr).forEach(System.out::println); //System.out::println可以替换为Lambda表达式 }
B.封装
(1)封装需要考虑什么
创建迭代器(Iterator)将数据集合的遍历和访问操作进行了抽象和封装,提供了一种统一的方式来访问集合中的元素。以下是一些迭代器的好处:
统一的