Java设计模式 - 迭代器模式
😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 一个有梦有戏的人 @怒放吧德德
🌝分享学习心得,欢迎指正,大家一起学习成长!
简介
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
迭代器模式原理解析
迭代器是java中遍历最常见的一种设计模式,提供一种遍历集合元素的统一接口,用同样的方法来遍历集合,不用知道集合对象的底层表示。
先来看看原理UML图:
角色与职责
- Iterator:迭代器接口,系统提供。
- ConcreteIterator:具体迭代器,管理迭代
- Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦
- ConcreteAggregate:具体的聚合持有对象集合,创建迭代器。
- Client: 客户端
迭代器模式实例
本次通过车行有许多品牌汽车,车行各自有各种型号的汽车,通过迭代输出相应信息。
本次使用lombok使用注解减少get、set等操作。
通过构建车行接口,让具体的旗舰店去实现里面的方法,聚合各自品牌各种型号的汽车,并创建迭代器。定义各种具体的迭代器,实现java.util.Iterator,提供迭代操作数据。
类图:
①、创建迭代器接口
包含添加车店信息和创建迭代器
package com.lyd.demo.car;
import java.util.Iterator;
/**
* @Author: lyd
* @Description: 车行 - 迭代器接口
* @Date: 2022-09-05
*/
public interface ICarDealership {
public String getName();
// 添加车店信息
public void addFlagshipStore(String name, String description);
// 创建迭代器
public Iterator createIterator();
}
②、创建实体
旗舰店实体类
package com.lyd.demo.store;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: lyd
* @Description: 旗舰店
* @Date: 2022-09-05
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FlagshipStore {
private String name;
private String description;
}
③、创建实现类
实现迭代器接口,实现所有方法,实例化具体汽车实体数组,并且创建迭代器
package com.lyd.demo.car.impl;
import com.lyd.demo.car.ICarDealership;
import com.lyd.demo.iterator.HongQiFlagshipStoreIterator;
import com.lyd.demo.store.FlagshipStore;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: lyd
* @Description: 红旗实现类
* @Date: 2022-09-05
*/
public class HongQiFlagshipStore implements ICarDealership {
ArrayList<FlagshipStore> stores;
public HongQiFlagshipStore() {
stores = new ArrayList<FlagshipStore>();
addFlagshipStore("红旗H5", "H5");
addFlagshipStore("红旗H7", "H7");
addFlagshipStore("红旗H7", "H9");
}
@Override
public String getName() {
return "红旗旗舰店";
}
@Override
public void addFlagshipStore(String name, String description) {
FlagshipStore flagshipStore = new FlagshipStore(name, description);
stores.add(flagshipStore);
}
@Override
public Iterator createIterator() {
return new HongQiFlagshipStoreIterator(stores);
}
}
④、定义具体迭代器
实现java.util.Iterator并实现其方法
package com.lyd.demo.iterator;
import com.lyd.demo.store.FlagshipStore;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: lyd
* @Description: 红旗汽车旗舰店 - 迭代器类 - 实现迭代器
* @Date: 2022-09-05
*/
public class HongQiFlagshipStoreIterator implements Iterator {
// 通过ArrayList存放对象FlagshipStore
ArrayList<FlagshipStore> stores;
int index = -1; // 索引下标
public HongQiFlagshipStoreIterator(ArrayList<FlagshipStore> stores) {
this.stores = stores;
}
@Override
public boolean hasNext() {
if (index >= stores.size() - 1) {
return false;
}
return true;
}
@Override
public Object next() {
FlagshipStore flagshipStore = stores.get(++index);
return flagshipStore;
}
@Override
public void remove() {
// 删除第一个
if (stores.size() > 0)
stores.remove(0);
else
System.out.println("删除失败!");
}
}
⑤、定义迭代器操作类
创建迭代器并且去执行操作迭代器来输出数据。
package com.lyd.demo.out;
import com.lyd.demo.car.ICarDealership;
import com.lyd.demo.store.FlagshipStore;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: lyd
* @Description: 输出实现
* @Date: 2022-09-05
*/
public class OutImpl {
ArrayList<ICarDealership> carDealerships; // 接口的数组
public OutImpl(ArrayList<ICarDealership> carDealerships) {
this.carDealerships = carDealerships;
}
public void printCarDealership() {
Iterator<ICarDealership> iterator = carDealerships.iterator(); // 装入迭代器Iterator中
while (iterator.hasNext()) {
ICarDealership c = iterator.next();
System.out.println("***************" + c.getName() + "****************");
printFlagshipStore(c.createIterator()); // 会根据是哪个旗舰店去创建迭代器
}
}
public void printFlagshipStore(Iterator iterator) { // 输出具体汽车型号
while (iterator.hasNext()) {
FlagshipStore flagshipStore = (FlagshipStore) iterator.next();
System.out.println(flagshipStore.getName());
}
}
}
⑥、测试
package com.lyd.demo.test;
import com.lyd.demo.car.ICarDealership;
import com.lyd.demo.car.impl.BenzFlagshipStore;
import com.lyd.demo.car.impl.HongQiFlagshipStore;
import com.lyd.demo.out.OutImpl;
import java.util.ArrayList;
/**
* @Author: lyd
* @Description:
* @Date: 2022-09-05
*/
public class IteratorTest {
public static void main(String[] args) {
ArrayList<ICarDealership> carDealerships = new ArrayList<ICarDealership>();
BenzFlagshipStore benz = new BenzFlagshipStore();
HongQiFlagshipStore hongQiFlagshipStore = new HongQiFlagshipStore();
carDealerships.add(benz);
carDealerships.add(hongQiFlagshipStore);
OutImpl out = new OutImpl(carDealerships);
out.printCarDealership();
}
}
运行结果:
👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍
💓德德小建议:
理解设计模式不是一件简单的事情,需要不断的学习和动手去练习,才能理解。只有掌握好设计模式,才能够真正的理解SpringAOP和Mybatis的底层原理。各位读者可以和我一样,动手敲一敲代码,甚至用不同的例子来做,通过debug一步一步调试,还有就是多看看别人的例子。能够有助于理解!谢谢各位观看指点!❤️ ❤️ ❤️