设计模式-迭代器模式-java-中文版

码上见分晓!
中文版本的设计模式详解,案例中的代码尽量使用了中文.
以游戏和生活中较好理解的场景讲解设计模式的实际用法,便于理解吸收,让设计模式的学习不再困难!!!
更多设计模式欢迎来到我的开源项目设计模式中文版

https://gitee.com/nightrunner/chinese-version-of-design-patterns

import java.util.ArrayList;
import java.util.List;

/**
 * 迭代器可以获取小队中的所有单位!!!
 */
public class 迭代器模式主程序 {

    public static void main(String[] args) {
        部队 队列 = new 部队<魔兽可选择单位>();
        队列.增加单位(new 弓箭手());
        队列.增加单位(new 弓箭手());
        队列.增加单位(new 弓箭手());
        队列.增加单位(new 女猎手());
        队列.增加单位(new 女猎手());
        队列.增加单位(new 女猎手());
        队列.增加单位(new 恶魔猎手());
        队列.增加单位(new 战争古树());

        for (单位类型 单位类型 : 单位类型.values()) {
            System.out.printf("部队中的%s单位:%n", 单位类型);
            迭代器<魔兽可选择单位> 获取迭代器 = 队列.获取迭代器(单位类型);
            while (获取迭代器.还有么()) {
                System.out.print(获取迭代器.下一个().getClass().getSimpleName() + " ");
            }
            System.out.println();
        }
    }

}

enum 单位类型 {
    建筑, 英雄, 小兵, 所有
}

interface 魔兽可选择单位 {
    单位类型 获取单位类型();
}

interface 英雄 extends 魔兽可选择单位 {
    @Override
    default 单位类型 获取单位类型() {
        return 单位类型.英雄;
    }
}

interface 建筑 extends 魔兽可选择单位 {
    @Override
    default 单位类型 获取单位类型() {
        return 单位类型.建筑;
    }
}

interface 小兵 extends 魔兽可选择单位 {
    @Override
    default 单位类型 获取单位类型() {
        return 单位类型.小兵;
    }
}

class 弓箭手 implements 小兵 {
}

class 女猎手 implements 小兵 {
}

class 恶魔猎手 implements 英雄 {
}

class 战争古树 implements 建筑 {
}

class 部队<T> {
    List<T> 单位们 = new ArrayList<>();

    public 部队() {
    }

    迭代器<T> 获取迭代器(单位类型 单位类型) {
        return new 迭代器实现(this, 单位类型);
    }

    public List<T> 获取单位们() {
        return 单位们;
    }

    public void 增加单位(T 单位) {
        单位们.add(单位);
    }
}

interface 迭代器<T> {

    T 下一个();

    boolean 还有么();

}

class 迭代器实现<T extends 魔兽可选择单位> implements 迭代器<T> {

    单位类型 单位类型;

    部队<T> 部队;

    int 当前下标;

    迭代器实现(部队 部队, 单位类型 单位类型) {
        this.部队 = 部队;
        this.单位类型 = 单位类型;
        this.当前下标 = -1;
    }

    @Override
    public T 下一个() {
        当前下标 = 获取下一个的下标();
        if (当前下标 != -1) {
            return 部队.获取单位们().get(当前下标);
        }
        return null;
    }

    @Override
    public boolean 还有么() {
        return 获取下一个的下标() != -1;
    }

    private int 获取下一个的下标() {
        List<T> 单位们 = 部队.获取单位们();
        int 临时下标 = 当前下标;
        while (true) {
            临时下标++;
            if (临时下标 >= 单位们.size()) {
                临时下标 = -1;
                break;
            }
            if (单位类型.所有 == 单位类型 || 单位们.get(临时下标).获取单位类型() == 单位类型) {
                break;
            }
        }
        return 临时下标;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值