Java 枚举高级应用之责任链模式

看 thinking in java 枚举那一段,看到这个例子还挺有意思的,所以记录了下来。

 

这是用枚举+责任链模式 模拟邮件发信步骤的例子。(PS:遍历枚举时顺序是按照定义时的顺序)

 

废话少说,贴代码。效果把代码拷回去run一下就知道了。

 

package enums;

import java.util.Random;

//获取枚举中随机属性
public class Enums {
	
	public static <T extends Enum<T>> T random(Class<T> ec){
		return random(ec.getEnumConstants());
	}
	public static <T>  T random(T[] values){
		//每次调用new一个新random,标识要不一样,要不然每次运行的结果都一样。
		return values[new Random(System.nanoTime()).nextInt(values.length)];
	}
}

 

package enums;

import java.util.Iterator;

 class Mail {

	enum GeneralDelivery {
		NO, OK1, OK2, OK3, OK4, OK5
	};

	enum Scannability {
		// 信件无法扫描
		UNSCANNABLE, YES1, YES2, YES3, YES4
	};

	enum Readablility {
		// 字迹模糊不清
		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;
	// 信件可读性
	Readablility readablility;
	// 地址
	Address address;
	// 退件地址
	ReturnAddress returnAddress;
	// 信件计数
	static long counter = 0;
	// 信件ID
	long id = counter++;

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

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

	// 创建一封信件
	public static Mail randomMail() {
		Mail m = new Mail();
		m.generalDelivery = Enums.random(GeneralDelivery.class);
		m.scannability = Enums.random(Scannability.class);
		m.readablility = Enums.random(Readablility.class);
		m.address = Enums.random(Address.class);
		m.returnAddress = Enums.random(ReturnAddress.class);
		return m;
	}

	// 创建count个邮件迭代集合
	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();
					}
				};
			}
		};
	}
}

  class PostOffice {
	enum MailHandler {
		GENERAL_DELIVERY {
			@Override
			public boolean handle(Mail m) {
				switch (m.generalDelivery) {
				case NO:
					System.out.println("揽收邮件(" + m + ")失败!");
					return false;
				default:
					System.out.println("揽收邮件(" + m + ")成功!");
					return true;
				}
			}

		},
		MACHINE_SCAN {
			@Override
			public boolean handle(Mail m) {
				switch (m.scannability) {
				case UNSCANNABLE:
					System.out.println("机器扫描邮件寄件地址(" + m + ")失败!");
					return false;
				default:
					System.out.println("机器扫描邮件寄件地址(" + m+ ")成功!");
					switch (m.address) {
					case INCORRECT:
						System.out.println("邮件(" + m + ")寄件地址错误!");
						return false;
					default:
						System.out.println("邮件(" + m+ ")寄件地址正确!");
						return true;
					}
				}
			}

		},
		VISUAL_INSPECTION {
			@Override
			public boolean handle(Mail m) {
				switch (m.readablility) {
				case ILLEGIBLE:
					System.out.println("人工核查邮件(" + m + ")寄件地址发现错误!");
					return false;
				default:
					System.out.println("人工核查邮件(" + m + ")寄件地址正常!");
					return true;
				}
			}
		},
		RETURN_TO_SEND {
			@Override
			public boolean handle(Mail m) {
				switch (m.returnAddress) {
				case MISSING:
					System.out.println("核查邮件(" + m + ")返件地址发现字迹模糊不清!");
					return false;
				default:
					System.out.println("核查邮件(" + m + ")返件地址结果正常!");
					return true;
				}
			}};
		abstract boolean handle(Mail m);
	}
	
	//模拟发邮件
	static void handle(Mail m){
		for(MailHandler handler : MailHandler.values()){
			if(!handler.handle(m)){
				System.out.println("邮件"+m+" 是一封死信!");
				return;
			}else continue;
		}
		System.out.println("邮件"+m+" 被正常发送!");
	}
	
	public static void main(String[] args){
		for(Mail mail : Mail.generator(10)){
		//	System.out.println(mail.details());
			handle(mail);
			System.out.println("****************");
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值