学院展示项目需求:

编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系。如图:

传统的设计方案(类图)

问题分析: 

  1. 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
  2. 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的遍历的操作
  3. 解决方案:=> 迭代器模式

迭代器模式

基本介绍

  1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式
  2. 如果我们的集合元素是用不同的方式实现的,有数组,还有 java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。
  3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

原理类图

对原理类图的说明-即(迭代器模式的角色及职责)

  1. Iterator : 迭代器接口,是系统提供,含义 hasNext, next, remove
  2. ConcreteIterator :  具体的迭代器类,管理迭代
  3. Aggregate :一个统一的聚合接口, 将客户端和具体聚合解耦
  4. ConcreteAggreage : 具体的聚合持有对象集合, 并提供一个方法,返回一个迭代器, 该迭代器可以正确遍历集合
  5. Client :客户端,  通过 Iterator 和 Aggregate 依赖子类

迭代器模式解决学院展示需求

代码示例:

//定义系
public class Department {private String name;private String desc;public Department(String name,String desc) {// TODO Auto-generated constructor stubthis.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}}
//不同学院实现迭代器类
public class ComputerCollageIterator implements Iterator{//这里我们需要知道Department是以怎样的形式存放Department[] departments;int position = 0;//遍历的位置public ComputerCollageIterator(Department[] departments) {// TODO Auto-generated constructor stubthis.departments = departments;}@Overridepublic boolean hasNext() {if(position  >= departments.length || departments[position] == null){return false;}else{return true;}}@Overridepublic Object next() {Department department = departments[position];position += 1;return department;}}
public class InfoColleageIterator implements Iterator{//信息工程学院以list集合形式存放List<Department> departments;int index = -1;//遍历的位置public InfoColleageIterator(List<Department> departments) {// TODO Auto-generated constructor stubthis.departments = departments;}@Overridepublic boolean hasNext() {if(index >= departments.size() -1){return false;}else{index++;return true;}}@Overridepublic Object next() {// TODO Auto-generated method stubreturn departments.get(index);}}
//学院
public interface Collage {public String getName();//增加系的方法public void addDepartment(String name,String desc);//返回一个遍历器遍历public Iterator creatIterator();
}
//学院具体类
public class ComputerCollage implements Collage{Department[] departments;int numOfDepartments = 0; //当前对象的个数 public ComputerCollage() {departments = new Department[5];addDepartment("Java专业","Java专业");addDepartment("PHP专业","PHP专业");addDepartment("大数据专业","大数据专业");}@Overridepublic String getName() {// TODO Auto-generated method stubreturn "计算机学院";}@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments[numOfDepartments] = department;numOfDepartments += 1;}@Overridepublic Iterator creatIterator() {return new ComputerCollageIterator(departments);}}
public class InfoColleage implements Collage{List<Department> departments;public InfoColleage() {departments = new ArrayList<Department>();addDepartment("信息安全专业","信息安全专业");addDepartment("网络安全专业","网络安全专业");addDepartment("服务器安全专业","服务器安全专业");}@Overridepublic String getName() {// TODO Auto-generated method stubreturn "信息工程学院";}@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments.add(department);}@Overridepublic Iterator creatIterator() {// TODO Auto-generated method stubreturn new InfoColleageIterator(departments);}}
//单独做了一个输出类,便于管理输出
public class OutPutImpl {//学院集合List<Collage> collages;public OutPutImpl(List<Collage> collages) {// TODO Auto-generated constructor stubthis.collages =collages;}//遍历所有学院,public void printCollage() {Iterator<Collage> iterator = collages.iterator();while (iterator.hasNext()) {Collage collage = iterator.next();System.out.println("==========="+collage.getName()+"==========");printDepartment(collage.creatIterator());}}public void printDepartment(Iterator iterator) {while (iterator.hasNext()){Department department = (Department) iterator.next();System.out.println(department.getName());}}
}
//测试类
public class Client {public static void main(String[] args) {//创建学院List<Collage> collages = new ArrayList<Collage>();ComputerCollage computerCollage = new ComputerCollage();InfoColleage infoColleage = new InfoColleage();//collages.add(infoColleage);collages.add(computerCollage);OutPutImpl outPutImpl = new OutPutImpl(collages);outPutImpl.printCollage();}
}

总结:

  • 优点
  1. 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
  2. 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
  3. 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
  4. 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式
  • 缺点
  1. 每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类

java设计模式(十五)——迭代器模式相关推荐

  1. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  2. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  3. Java设计模式系列之——迭代器模式

    本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...

  4. Java设计模式 (1) —— Iterator迭代器模式

    拿到这个话题,首先搞清楚:什么是迭代器? 大家都学过 for-i 循环,for-i循环的本质就是 通过i++ 或者 i-- ,以实现 从数据的一端 一个一个地遍历数据元素,直到另一端的最后一个元素,将 ...

  5. Java设计模式(十五):桥接设计模式

    1. 应用场景 假如你正在为一个新的人体工学且友好的电视遥控器编程.你要使用好的OO技能,让所有的遥控器都基于相同的抽象,对此抽象又做出不同的实现-每部不同型号的电视机都有自己的遥控器的实现. 2. ...

  6. Java设计模式(十):迭代器设计模式

    1.应用场景 (1)访问一个聚合对象的内容而无需暴露它的内部表示 (2)支持对聚合对象的多种遍历 (3)为遍历不同的聚合结构提供一个统一的接口 2.概念 提供一种顺序访问聚合对象元素的方法,并且不暴露 ...

  7. 设计模式之外观模式php,php设计模式(十五)外观模式

    外观模式又叫门面模式: 现在都是模块化开发了: 开发中很多时候都是在使用各种扩展包: 或者在外观模式中我们叫做子系统: 外观模式的作用就是减少子系统之间的耦合: 降低子系统的使用难度: 我们举个栗子: ...

  8. Java设计模式10,建造者模式

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

  9. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  10. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

最新文章

  1. MySQL中查询的看到的日期和Java程序查询出来的日期差了几个小时
  2. 如何从从工程师跨步管理者,微博信息安全总经理手把手教你企业安全体系建设...
  3. 01_字符串处理-----04_在文本中应用ZIpf定律
  4. Mustache.js和Handlebars.js有什么区别?
  5. [转]掌握Ajax 第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 [IBM]
  6. python制作验证码_Python编写生成验证码的脚本的教程
  7. PVM的安装和编译PVM程序
  8. 【原创】SqlServer 2005 BCP命令详解
  9. Connected to the target VM, address: ‘127.0.0.1:0‘, transport: ‘socket‘ Disconnected from the target
  10. 转载——三种编程命名规范(匈牙利命名法、驼峰式命名法、帕斯卡命名法)...
  11. phpwind8.7升级9.0.1过程(三)20130107升级到20130227
  12. SpringBoot日志的相关知识
  13. CRC校验码计算:多项式除法-模2除法
  14. Quartus 实现D触发器及仿真
  15. 内网渗透-域管理员定位
  16. Lum Proxy全球代理IP,真实家庭住宅网络!
  17. C++2022NOC之初赛数字规律
  18. 2020年同济软院夏令营经历
  19. 【图灵访谈】高德纳:总有一些东西超越我们的理解
  20. 玲珑骰子安红豆,入骨相思君知否?

热门文章

  1. 《天龙八部》及Ogre3D模型的3ds max导入插件(源代码发布)
  2. 你嘴上所说的人生,就是你的人生
  3. Python Numpy库教程(超详细)
  4. Scrapy框架爬虫小说网工作流程
  5. 如何解决网站提示“不安全”
  6. linux yum安装ipmitool,centos安装ipmitool
  7. USB接口供电不足以及相关故障
  8. csv格式用什么打开可以编辑_mov格式的视频如何转换mp9?可以用什么转换器?
  9. 2009-09-20更新新超人HTTP代理
  10. var和val的区别