设计模式--------迭代器模式
介绍迭代器模式的四大问题
- 现在的写法有什么问题吗?
- 为什么要用迭代器模式?
- 什么是迭代器模式?
- 迭代器模式有什么好处?
使用一个例子进行问题的说明
- 有二个工厂仓库,它们分别存着一些产品,但是这二个工厂仓库存物品的仓库不一样,导致工作人员要清点检查每个产品的时候需要分开检查,有什么办法解决呢?
Good 货物
public class Good {
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
FactoryA
public class FactoryA {
Good[] goods;
public FactoryA() {
goods = new Good[10];
for (int i = 0; i < 10; i++) {
Good good = new Good();
good.setName(String.valueOf(i));
good.setDescription("description: " + String.valueOf(i) + "A");
goods[i] = good;
}
}
public Good[] getGoods() {
return goods;
}
}
FactoryB
public class FactoryB {
List<Good> goods;
public FactoryB() {
goods = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Good good = new Good();
good.setName(String.valueOf(i));
good.setDescription("description: " + String.valueOf(i) + "B");
goods.add(good);
}
}
public List<Good> getGoods() {
return goods;
}
}
Checker
public class Checker {
FactoryA a;
FactoryB b;
public Checker(FactoryA a, FactoryB b) {
this.a = a;
this.b = b;
}
public void checkGoods() {
Good[] goods = a.getGoods();
List<Good> goods2 = b.getGoods();
for (int i = 0; i < goods.length; i++) {
System.out.println(goods[i]);
}
for (int i = 0; i < goods2.size(); i++) {
System.out.println(goods2.get(i));
}
}
}
Main
public class Main {
public static void main(String[] args) {
FactoryA a = new FactoryA();
FactoryB b = new FactoryB();
Checker checker = new Checker(a, b);
checker.checkGoods();
}
}
有什么问题?
- 检查人员需要分别使用不同的方式取出产品
什么是迭代器模式
- 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
自定义迭代器接口,改造代码
- 创建迭代器接口
- 分别创建仓库a和仓库b以实现接口
- 工厂返回仓库数据改为返回新的迭代器接口
- 检察人员根据返回的迭代器进行数据的校验
Iterator
public interface Iterator {
public Object next();
public boolean hasNext();
}
GoodAIterator
public class GoodsAIterator implements Iterator {
Good[] goods;
int position = 0;
public GoodsAIterator(Good[] goods) {
this.goods = goods;
}
@Override
public Object next() {
Good good = goods[position];
position = position + 1;
return good;
}
@Override
public boolean hasNext() {
if (position >= goods.length || goods[position] == null) {
return false;
}
return true;
}
}
GoodBIterator
public class GoodBIterator implements Iterator {
List<Good> goods;
int position = 0;
public GoodBIterator(List<Good> goods) {
this.goods = goods;
}
@Override
public Object next() {
Good good = goods.get(position);
position = position + 1;
return good;
}
@Override
public boolean hasNext() {
if (position >= goods.size() || goods.get(position) == null) {
return false;
}
return true;
}
}
FactoryA
public class FactoryA {
Good[] goods;
public FactoryA() {
goods = new Good[10];
for (int i = 0; i < 10; i++) {
Good good = new Good();
good.setName(String.valueOf(i));
good.setDescription("description: " + String.valueOf(i) + "A");
goods[i] = good;
}
}
public Iterator getGoods() {
return new GoodsAIterator(goods);
}
}
FactoryB
public class FactoryB {
List<Good> goods;
public FactoryB() {
goods = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Good good = new Good();
good.setName(String.valueOf(i));
good.setDescription("description: " + String.valueOf(i) + "B");
goods.add(good);
}
}
public Iterator getGoods() {
return new GoodBIterator(goods);
}
}
Checker
public class Checker {
FactoryA a;
FactoryB b;
public Checker(FactoryA a, FactoryB b) {
this.a = a;
this.b = b;
}
public void checkGoods() {
Iterator iterator = a.getGoods();
Iterator iterator2 = b.getGoods();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
while(iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
}
迭代器模式有什么好处?
- 可以不用管底层是如何实现的,只需要使用迭代器进行遍历
java自带的迭代器
- java中自带一个迭代器接口,有三个方法
- next
- hasnext
- remove
- ArrayList等集合都实现了迭代器接口,只需要调用方法即可获取到迭代器,无需自己实现接口
设计原则
- 单一责任:一个类应该只有一个引起变化的原因
END
不慕招式,勤修内功