- Iterator模式
- Template Method 模式
- 迭代器是什么?为什么要用迭代器?
解释: 将遍历与实现分离出来,加入我只想要遍历一个集合,不想知道这是什么实现,实现多种多样,但是我的需求就只有一个,就是遍历,因此,使用迭代器模式,可以提供一个统一的接口给外部访问,不用让用户关心这是什么集合
java 是面向接口编程,一般是 List<Integer> list = new LinkedList<>();或 ArrayList, 一般用接口去引用这个实现类,如果是使用具体的类来解决问题,容易导致类的强耦合,这些类难以作为组件复用,因此需要引入抽象类和接口,而Iterator 则是为List接口提供了统一遍历的方法
那么,什么是 listItarator ,.listIterator 其实继承了 iterator 的接口,调用 list.iterator() ,其实是 返回
是ListIterator,listIterator 方法比 iterator 方法多,可以添加元素,删除元素,逆向遍历
至于 spliterator 之类的有时间再来慢慢研究了
- 什么是 TemplateMethod (结合工厂模式学习)?
依赖倒置原则
面向过程的开发,上层调用下层,上层依赖于下层,也就是说如果 是 LinkedList list = new LinkedList();
哪天我改成 ArrayList 了,别的方法调用了 list的方法就要改了,例如 我用了 LinkedList 里面的 removeFirst,removeLast 方法,而 ArrayList里是没有定义这个方法的
也就是说,当下层发生剧烈的变动,上层也要变动,模块的复用性就会降低,提高开发成本
而面向对象的开发的处理方法,则是定义一个接口,规范所有实现的子类,接口定义规则,由子类去写具体实现,这样的话用接口去引用子类 就能做到有意识的去规范自己的代码,降低后期改代码的成本。
其实一般来说 抽象层的变化概率比较小,让用户代码分层,分离出抽象层,让用户程序依赖于抽象层,实现的目的依赖于抽象层。这样实现的细节不停的变动,抽象层不变,客户程序与实现细节的耦合性就降低了
首先要了解模板方法的意义 :
父类模板编写了算法,无需在子类再编写算法(super关键字调用),如果模板方法有bug,那么修改后,改一处,子类的也就改了。使用Template method模式中,父类与子类紧密联系、共同工作,子类实现父类的抽象方法,必须了解抽象方法被调用的时机,父类和子类的互相协作支撑起整个程序,更多的方法实现写到父类,子类会变得很轻松,也降低了子类的灵活性,更多的实现方法放到子类,代码就会臃肿,各代码间出现重复
从子类的角度来看,子类使用父类的定义方法,子类增加新方法来实现更多功能,子类重写父类的方法改变程序行为。
而从父类的角度来看,父类期待(要求)子类去实现声明的抽象方法
模板方法的使用场景:
一次性实现一个算法不变的部分,并将可变行为留给子类实现
各个子类中公共的行为被提取出并集中到一个公共的父类中,
从而避免代码重复
1.提高复用性
2.提高扩展性
3.符合开闭原则
模板方法的缺点:
1. 类的数目增加
2. 增加了系统实现的复杂度
3. 继承关系自身缺点,如果父类添加新的抽象方法,所有的子类都要改一遍
模板方法的扩展:钩子方法
相关的设计模式:1.工厂方法模式 ; 2.策略模式
策略模式可以改变算法流程,而模板方法模式不改变算法流程
一个 if,一个 else if, 不同的 if,我们可以认为是不同的策略
可以考虑策略模式的使用