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

看 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("****************");

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值