看 thinking in java 枚举那一段,看到这个例子还挺有意思的,所以记录了下来。
这是用枚举+责任链模式 模拟邮件发信步骤的例子。(PS:遍历枚举时顺序是按照定义时的顺序)
废话少说,贴代码。效果把代码拷回去run一下就知道了。
package enums;
import java.util.Random;
//获取枚举中随机属性
public class Enums {
public static > T random(Class ec){
return random(ec.getEnumConstants());
}
public static 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 generator(final int count) {
return new Iterable() {
int n = count;
@Override
public Iterator iterator() {
return new Iterator() {
@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("****************");
}
}
}