`

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("****************");
		}
	}
}
分享到:
评论

相关推荐

    高阶Java-Java枚举类型 enum 应用详解

    本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...

    JAVA高级编程中Enum枚举

    本资源包提供了一些关于`Enum`枚举的深入学习材料,包括实例、常见问题以及相关的文档,非常适合Java开发者进行高级编程的学习和复习。 首先,枚举的基本语法是定义一个公共类,前面加上关键字`enum`。例如: ```...

    列举java 枚举相关信息

    ### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。

    Java枚举数据类型.doc

    Java枚举数据类型是Java 1.5及以后版本引入的一种强大的、类型安全的数据结构,旨在解决传统int常量或String常量表示枚举时存在的问题。在Java中,枚举是一种特殊的类,用于定义一组预定义的常量,这些常量在程序中...

    Java中的枚举类型Enum示例源代码

    Java枚举支持单例模式,因为每个枚举常量都是唯一的,不能通过`new`关键字实例化。此外,枚举类型的枚举常量可以按照声明顺序自然排序,这使得它们在处理有序数据时非常方便。 枚举类型还可以与其他集合框架结合...

    Java高级实用教程

    以上只是"Java高级实用教程"中的一部分核心内容,实际教程可能还涵盖设计模式、NIO、并发容器、JMS消息队列、Spring框架、数据库连接池等更多主题。通过深入学习和实践,你将能够成为一位熟练的Java开发者,解决复杂...

    java与模式光盘源码

    《Java与模式》是阎宏博士撰写的一本经典IT著作,深入浅出地探讨了如何在Java编程中应用设计模式。这本书的光盘源码包含了书中提到的各种模式的实例代码,为读者提供了实践和理解设计模式的宝贵资源。在本文中,我们...

    你不知道的JAVA高级应用

    4.拆箱装箱的中的项元模式,当该对象在一个字节内时 -128~~127 的时候 用的是同一个对象 5.可变量参数, object ... paramName,当对参数不确定的时候] 6.枚举,对目标的选择进行了强制的约束 7....... ..........

    高级java工程师面试考纲,java高级工程师进阶知识地图

    **单例模式**、**工厂模式**、**抽象工厂模式**、**建造者模式**、**原型模式**、**适配器模式**、**装饰器模式**、**代理模式**、**桥接模式*...**、**中介者模式**、**备忘录模式**、**状态模式**、**责任链模式**...

    北大青鸟Java高级特性

    枚举类型可以拥有方法和字段,并且支持抽象方法,使得它们在设计模式中,如策略模式和工厂模式,有着广泛的应用。 3. **泛型(Generics)**:泛型提供了一种方式来限制容器对象只能存储特定类型的数据,增强了类型...

    徐传运 JAVA高级程序设计课后习题答案

    Java语言的高级特性包括但不限于:多线程、异常处理、反射、枚举、泛型、IO流、网络编程、集合框架等。在这些章节中,习题可能会涉及到如何创建和管理线程,如何优雅地处理程序运行时的异常,如何利用反射动态操作类...

    java设计模式实例

    9. **责任链模式(Chain of Responsibility)**:避免将处理逻辑硬编码到对象中,而是让对象组成一条链,请求沿着链传递,直到被某个对象处理。 10. **命令模式(Command)**:将请求封装为一个对象,以便使用不同...

    重塑java基础高级进阶资源分享

    通过以上对Java基础知识的回顾以及高级进阶知识点的介绍,我们不仅了解了Java作为一种广泛使用的编程语言的基本特性和核心概念,还深入探讨了其高级特性、设计模式以及相关的技术和框架。这些知识对于希望进一步提升...

    java模式源代码

    在Java中,主要分为三大类:创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如观察者、策略、责任链等)。这些模式在实际编程中有着广泛的应用,例如,单例模式...

    张孝祥JAVA视频教程高级部分完整版

    这通常涵盖了Java的多线程、网络编程、I/O流、反射、枚举、集合框架、设计模式、JVM优化等多个重要主题。以下是这些关键知识点的详细介绍: 1. **多线程**:Java以其强大的并发处理能力而著称,多线程是其核心特性...

    JAVA程序常用设计模式

    本资料包聚焦于“JAVA程序常用设计模式”,旨在帮助中高级JAVA程序员进一步提升编程能力。 1. 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式通常通过双重检查锁定、静态内部类或...

    java模式 java深度历险

    - **责任链模式**:避免对象间耦合,通过将请求沿着处理者链传递,直到找到合适的处理者。 - **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...

    JAVA核心技术 卷1 高级特性

    《JAVA核心技术 卷1 高级特性》是Java开发者深入理解平台的重要参考资料,它涵盖了Java编程的高级主题,包括多线程、网络编程、高级I/O、反射、泛型、枚举、注解等核心概念。这本书是基于原书第9版编写的,更新了...

    Java程序设计与开发应用(第二版)

    在高级特性中,Java的IO流系统、多线程编程、反射机制、枚举类型、注解(Annotation)以及Java 8及以后版本引入的Lambda表达式和Stream API,都可能是本书的重点章节。这些内容对于编写高效、可维护的代码至关重要。...

Global site tag (gtag.js) - Google Analytics