Geek

博客园 首页 新随笔 联系 订阅 管理
  1. Iterator模式
  2. 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,我们可以认为是不同的策略

可以考虑策略模式的使用

 

posted on 2020-03-16 12:41  .geek  阅读(183)  评论(0编辑  收藏  举报