花果山演绎——深入浅析迭代器模式

今天我们来演绎一下设计模式中的迭代器模式。

首先我们来看一个故事。

缘起

话说悟空学成本领归来,要在花果山练出一批猴子大军,于是他册封了四个手下健将,马、流二元帅,崩、芭二将军,由他们带领底下的猴子进行操练。一段时间后,猴王决定检验他们的操练成果,每位将军都将从手下挑选出一批出色的猴子上台去给猴王展示武艺。

各显神通

这几位将军性格不同,对于手下的管理及组织自然也不同。

数组天下无敌

马、流二元帅,他们给每个猴子分配一个编号,猴子的编号从1开始,依次连续的向上叠加。组织报幕者需要通过报编号的方式,叫对应的猴子上台。

这个是马流二元帅的组织方式,使用数组列表

public class GeneralNumber {


    private List<Monkey> soldiers = new ArrayList<>();


    // 把猴子注册进去
    public void registerSolider(Monkey newSolider) {
        soldiers.add(newSolider);
    }
    // 该编号猴子组织变动,从下属里移除
    public void removeSolider(int index) {
        soldiers.remove(index);
    }


    public List<Monkey> getSoldiers() {
        return soldiers;
    }


    public static GeneralNumber getInstance() {
        GeneralNumber generalNumber = new GeneralNumber();
        generalNumber.registerSolider(new Monkey("大猴子"));
        generalNumber.registerSolider(new Monkey("二猴子"));
        generalNumber.registerSolider(new Monkey("三猴子"));
        generalNumber.registerSolider(new Monkey("四猴子"));
        return generalNumber;
    }
}

链表轻松愉快

崩、芭二将军,他们没有做什么编号,就是让手下的猴子一个个排好队,然后每次需要报幕者喊“下一个”,猴子们顺序上去就可以了。

下面是崩芭二将军的组织方式,使用链表

public class GeneralLink {


    // 排在最前面的猴子
    private Node headSolider;


    private Node lastSolider;


    public Node getHeadSolider() {
        return headSolider;
    }


    // 把猴子注册进去(尾插法),不保证线程安全
    public void registerSolider(Monkey newSolider) {
        Node node = new Node(newSolider);
        if (headSolider == null) {
            headSolider = node;
            lastSolider = node;
        } else {
            lastSolider.setNext(node);
            lastSolider = node;
        }
    }


    // 节点这个概念包含了排队猴子,以及猴子之间关联关系
    static class Node {
        // 代表当前真实的猴子
        private Monkey solider;
        // next代表后面的那只猴子,
        private Node next;


        public Node(Monkey solider) {
            this.solider = solider;
        }


        public void setNext(Node next) {
            this.next = next;
        }


        public Monkey getSolider() {
            return solider;
        }


        public Node getNext() {
            return next;
        }
    }


    public static GeneralLink getInstance() {
        GeneralLink generalLink = new GeneralLink();
        generalLink.registerSolider(new Monkey("猴子A"));
        generalLink.registerSolider(new Monkey("猴子B"));
        generalLink.registerSolider(new Monkey("猴子C"));
        generalLink.registerSol
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值