读书人

施用enum的责任链

发布时间: 2012-09-19 13:43:53 作者: rapoo

使用enum的责任链

package enumerated;import java.util.Iterator;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, OK6}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 m = new Mail();m.generalDelivery = Enums.random(GeneralDelivery.class);m.scannability = Enums.random(Scannability.class);m.readability = Enums.random(Readability.class);m.address = Enums.random(Address.class);m.returnAddress = Enums.random(ReturnAddress.class);return m;}public static Iterable<Mail> generator(final int count){return new Iterable<Mail>(){int n = count;public Iterator<Mail> iterator() {return new Iterator<Mail>(){public boolean hasNext() {return n-->0;}public Mail next() {return randomMail();}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+" automatically");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:System.out.println("Returning "+m+" to sender");return true;}}};abstract boolean handle(Mail m);}static void handle(Mail m){for(MailHandler handler : MailHandler.values())if(handler.handle(m))return;System.out.println(m+ " is a deat letter");}public static void main(String[] args) {for(Mail mail : Mail.generator(10)){System.out.println(mail.details());handle(mail);System.out.println("*****");}}}

?

?

责任链有enum Mailhandler实现,而enum定义的次序决定了各个解决策略

在应用时的次序。对每一封邮件, 都要按照此顺序尝试每个解决策略,

直到其中一个能够成功处理该邮件,如果所有策略都失败,那么

该邮件将被判定为一封死邮件

读书人网 >编程

热点推荐