施用enum的责任链

使用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定义的次序决定了各个解决策略

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

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

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