使用enum的职责链

文章展示了一个使用Java实现的职责链设计模式,通过一系列枚举类型(如GeneralDelivery,Scannability等)来表示邮件的各种状态,并定义了多个处理邮件的枚举处理器(如GENERAL_DELIVERY,MACHINE_SCAN等)。邮局类(PostOffice)遍历处理链,直到找到能处理特定邮件的处理器,否则将其标记为死信。
摘要由CSDN通过智能技术生成
import java.util.EnumSet;
import java.util.Iterator;
import java.util.Random;

import static sun.misc.Signal.handle;

/**
 * 在职责链设计模式中,程序员以多种不容方式来解决一个问题,然后将他们连接在一起,当一个请求到来时,
 * 他遍历这个链,直到链中的某个解决方案能够处理该请求。
 */
public class Mail {
    enum GeneralDelivery {YES, NO1, NO2, NO3, NO4, NO5}

    enum Scannability {UNSCANNABLE, YES1, YES2, YES3, YES4}

    enum Readability {ILLEGIBLE, YES1, YES2, YES3, YES4}

    enum Address {INCORRECT, OK1, OK2, OK3, OK4, OK5, OK6}

    enum ReturnAddress {MISSING, OK1, OK2, OK3, OK4, OK5}

    GeneralDelivery generalDelivery;
    Scannability scannability;
    Readability readability;
    Address address;
    ReturnAddress returnAddress;
    static long counter = 0;
    long id = counter++;

    public String toString() {
        return "Mail" + id;
    }

    public String details() {
        return toString() +
                ", General Delivery: " + generalDelivery +
                ", Address Scanability: " + scannability +
                ", Address Readability: " + readability +
                ", Address Address" + address +
                ", Return Address" + returnAddress;
    }

    public static Mail randomMail() {
        Mail mail = new Mail();
        mail.generalDelivery = Enums.random(GeneralDelivery.class);
        mail.scannability = Enums.random(Scannability.class);
        mail.readability = Enums.random(Readability.class);
        mail.address = Enums.random(Address.class);
        mail.returnAddress = Enums.random(ReturnAddress.class);
        return mail;
    }

    public static Iterable<Mail> generator(final int count) {
        return new Iterable<Mail>() {
            int n = count;
            @Override
            public Iterator<Mail> iterator() {
                return new Iterator<Mail>() {
                    @Override
                    public boolean hasNext() {
                        return n-- > 0;
                    }

                    @Override
                    public Mail next() {
                        return randomMail();
                    }

                    @Override
                    public void remove() {
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };

    }
}
public class PostOffice {
    enum MailHandler {
        GENERAL_DELIVERY {
            boolean handle(Mail m) {
                switch (m.generalDelivery) {
                    case YES:
                        System.out.println("Using general delivery for " + m);
                        return true;
                    default:return false;
                }
            }
        },
        MACHINE_SCAN {
            boolean handle(Mail m) {
                switch (m.scannability) {
                    case UNSCANNABLE:return false;
                    default:
                        switch (m.address) {
                            case INCORRECT: return false;
                            default:
                                System.out.println("Delivering"+ m + "automaticallu");
                                return true;
                        }
                }
            }
        },
        VISUAL_INSPECTION {
            boolean handle(Mail m) {
                switch (m.readability) {
                    case ILLEGIBLE:return false;
                    default:
                        switch (m.address) {
                            case INCORRECT: return false;
                            default:
                                System.out.println("Delivering"+ m + "normally");
                                return true;
                        }
                }
            }
        },
        RETURN_TO_SENDER {
            boolean handle(Mail m) {
                switch (m.returnAddress) {
                    case MISSING:return false;
                    default:
                        switch (m.address) {
                            case INCORRECT: return false;
                            default:
                                System.out.println("Delivering"+ m + "to sender");
                                return true;
                        }
                }
            }
        };

        abstract boolean handle(Mail m);
    }

    static void handle(Mail m) {
        for (MailHandler value : MailHandler.values()) {
            if (value.handle(m)){
                return;
            }
            System.out.println(m+"is a dead letter");
        }
    }

    public static void main(String[] args) {
        for (Mail mail : Mail.generator(10)) {
            System.out.println(mail.details());
            handle(mail);
            System.out.println("*****");
        }
    }
}
import jdk.nashorn.internal.ir.CallNode;
/**
 * 随机选取
 * <T extends Enum<T>>表示T是一个enum实例 我们就可以利用class对象得到enum实例的数组了,重载后的random方法只需使用T[]作为参数,因为他并不会调用Enum上的任何操作,
 * 他只需从数组中随机选择一个元素即可,这样,最终的返回类型正是enum的类型
 */
import java.util.Random;

public class Enums {
    private static Random rand = new Random(47);
    public static <T extends Enum<T>> T random(Class<T> clazz) {
        //return clazz.getEnumConstants()[rand.nextInt(clazz.getEnumConstants().length)];
        return random(clazz.getEnumConstants());
    }

    public static <T extends Enum<T>> T random(T[] enums) {
        return enums[rand.nextInt(enums.length)];
    }

    public static Food random(Food[] values) {
        return (Food) random(values);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值