设计模式之迭代器模式 引导篇
迭代器模式-引导篇
这两天,比较火的并购新闻就是,网易考拉被阿里以20亿美元收购。从此网易考拉不再姓“网”而姓“阿”了。并购后的网易考拉和阿里的电商系统进行对接。那么问题来了:在阿里有个早餐店的菜单(CakeHouseMenu)使用的事ArrayList来存放菜单的,考拉有个午餐店的菜单(DinerMenu)使用的是数组结构存放的。现在考拉和阿里合并了,两个点的菜单也要合并。
我们先来看看第一版设计:
因为马爸爸说了,国庆之前,必须合并上线,时间紧任务中,肿么办?那就再创建一个对象,使用一个菜单对象,将早餐店对象机午餐店对象作为属性,调用的时候,直接调用各自对象的就可以。类图如下:
顾客来了,点早餐,服务器就从菜单中调用早餐店的get方法。得到KFC早餐套餐
如果点的是午餐,就从菜单中调用午餐店的getMenuItem方法,得到快餐一份。
代码如下:
运行ConventionalMainTest运行结果:
我们可以看到,早餐、午餐菜单也都打印出来了。正常啊,没问题啊。
我们先来看看服务员(waitress)对象里面内容:
从上图中,我们可以看到在服务员对象中有早餐店对象、午餐店对象、list类型的items以及数组类型的items。从运行结果上来看,是没有问题的。但是要是过了N+X天后,马爸爸又玩起了收购肿么办?假设收购的是X店。X店的菜单使用的是hashTable这种类型的。
难道,我们要在waitress中在添加X店对象同时添加hashTabel类型的items吗?好,就算收购一个,添加一个可以。
那么如果收购了M+N个店。菜单数据类型使用了W种类型。难道,每次都修改waiters这个类吗?
这样行是行,但是在后期维护、管理比较麻烦。而且还违背了开闭原则(对修改是封闭的,对扩展是开放的)。那么怎么办呢?
思考:
我们在开发的时候,针对接口开发,这样耦合度也可以降低。我们假设两个饭店的菜单都实现了一个接口。然后waiter对象只要拥有接口对象就可以。
封装遍历的顶级接口,迭代器类图如下:
我们用迭代器接口来修改菜单:
说明:
CakeHouseIterator和DinerIterator两个类是实现了Iterator接口的
修改两个饭店获取getIterator的方法。返回对应放到实现iterator接口的对象。
我们来看早餐店的iterator对象:
在重写hasNext机next方法。
我们在来看看修改后的服务员对象:
这个时候,服务员对象只有iterator对象了。已经实现了对早餐店及午餐店的解耦。
再来看看测试类:
在服务员对象添加菜单的时候,是不知道具体添加的是早餐店的菜单还是午餐店的菜单。实现了解耦。
这样做的好处:
一:类之间实现了松耦合
二:就算考拉修改了菜单数据结构也不影响服务员的点餐。也是实现耦合的一种表现。
不写了,太困了。已经7号凌晨一点多了。各位看官,今日太累了,写不不好,在迭代器总结篇好好不上
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
我竟然不再抗拒 Java 的类加载机制了
很长一段时间里,我对Java 的类加载机制都非常的抗拒,因为我觉得太难理解了。但为了成为一名优秀的 Java 工程师,我决定硬着头皮研究一下。01、字节码 在聊 Java 类加载机制之前,需要先了解一下 Java 字节码,因为它和类加载机制息息相关。计算机只认识 0 和 1,所以任何语言编写的程序都需要编译成机器码才能被计算机理解,然后执行,Java 也不例外。Java 在诞生的时候喊出了一个非常牛逼的口号:“Write Once, Run Anywhere”,为了达成这个目的,Sun 公司发布了许多可以在不同平台(Windows、Linux)上运行的 Java 虚拟机(JVM)——负责载入和执行 Java 编译后的字节码。 到底 Java 字节码是什么样子,我们借助一段简单的代码来看一看。 源码如下: package com.cmower.java_demo;public class Test { public static void main(String[] args) { System.out.println("沉默王二"); }} 代码编译通过后,通过xxd Test.cla...
- 下一篇
在阿里云上通过宝塔面板安装禅道
在阿里云上通过宝塔面板安装禅道 禅道安装,这个之前答应过朋友的。正好,今晚又说起这个事,索性就在阿里云上安装算了。 相信很多朋友都用过禅道这个工具。使用过的朋友都知道,禅道是基于PHP开发的。对于使用Java开发的凯哥来说,LAMP环境,还真不会搭建。还好,之前就一直使用宝塔面板。有了这个面板LAMP环境就很容易搭建了。本教程是基于禅道11.6.2开源版的。 凯哥个人博客:www.kaigejava.com 禅道下载: 搜索引擎输入:禅道。如下图: 直接去官网下载即可。 下载源码文件: 宝塔面板安装: 可以搜索官网,里面有教程。下面的是命令是安装6的。现在好像升级到7了。 安装完成之后,登陆到面板。如果是第一次登陆,会让选择LAMP环境。 凯哥选择的是Nginx的这个。 等环境安装完成之后,就可以安装禅道了。 禅道安装: 登陆宝塔面板,站点管理中,添加站点。如下图: 需要注意的: 数据库:选择Mysql PHP版本:选择PHP-70 上传下载的禅道源码包到站点根目录。如下图: 解压之后,通过浏览器访问:域名+端口/install.php 需要注意:域名要解析到对应的服务器ip上。否则有...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池