`
racingbird
  • 浏览: 23694 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

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

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

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

分享到:
评论
1 楼 zheng108 2013-02-18  
public class Enums {
  private static Random rand = new Random(47);
  public static <T extends Enum<T>> T random(Class<T> ec) {
    return random(ec.getEnumConstants());
  }
  public static <T> T random(T[] values) {
    return values[rand.nextInt(values.length)];
  }
}

相关推荐

    Java设计模式责任链模式共7页.pdf.zip

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间传递请求,同时赋予这些对象决定是否处理请求以及如何处理的权力。这种模式的主要优点是解耦了发送者和接收者,使得系统中的多个对象可以有机会处理一个...

    Responder:活动链责任

    Responder是一个程序包,它提供了一种通过责任链使用基于委托人模式的更好的实现协议和通知中心提供的更好的方法来发送数据的方法 如何使用此套件? 这很简单,首先,我们只实现协议Responder ,在此我们要基于值...

    C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)

    3. 请求(Request):封装了请求的信息,如请求类型、数据等,供处理者使用。 ```csharp public class Request { public RequestType Type { get; set; } // 其他请求相关的属性... } public enum RequestType { ...

    设计模式-职责链模式(讲解及其实现代码)

    - **责任分配灵活**:可以通过调整链的结构来改变请求的处理流程。 **缺点**: - **复杂性**:如果链过长,可能会导致维护困难,且调试时难以跟踪请求的流向。 - **性能影响**:如果链中处理者过多,请求可能需要...

    responsibility2.zip

    "责任链"(Chain of Responsibility)是其中一种重要的行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在这个名为"responsibility2.zip"的压缩包文件中,我们可以深入探讨...

    JAVA枚举与设计模式PPT教案学习.pptx

    最后,PPT还提到了责任链模式,虽然没有详细介绍,但枚举可以在构建职责链中扮演角色,每个枚举常量代表一个处理逻辑,形成一个处理请求的链条。 总结来说,这个PPT教案深入浅出地介绍了Java枚举的特性以及如何利用...

    Java程序设计模式程序设计.doc

    * Chain of Responsibility(责任链模式):使多个对象都有机会处理请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它。 * Command(命令模式):将请求封装成对象,以便使用不同的请求、...

    Java设计模式 影印

    - 责任链模式(Chain of Responsibility):避免请求发送者和接收者之间的耦合,将多个处理者组织成链,请求沿着链传递,直到被处理。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列...

    23种设计模式的java实现

    17. 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理它为止。 18. 状态模式(State...

    headofdesign(C#_Java)\0-107headfirst设计模式

    14. **责任链模式**:处理请求的对象形成一个链,沿着链传递请求,直到有对象处理为止,降低了对象间的耦合。 15. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求或参数化请求。适用于解耦发出...

    2021-2022计算机二级等级考试试题及答案No.17775.docx

    17. 在C#中,使用`enum`关键字声明枚举类型。 18. 黑客(Hacker)是指擅长技术的计算机专家,有时指非法侵入计算机系统的人员。 19. HTML中的`&lt;input type="text"&gt;`标签用于创建单行文本输入域。 20. 装饰设计...

    Java常见的设计模式

    10. **责任链模式(Chain of Responsibility)**:避免对象之间紧密耦合,使得多个对象都有机会处理请求,形成一条处理链。 11. **命令模式(Command)**:将请求封装为一个对象,使得可以使用不同的请求、队列请求...

    java与模式

    行为型模式主要关注对象之间的交互和职责分配,例如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)。这些模式让代码更加模块化,支持动态改变对象的行为或策略。 “设计...

    利用Java实现的银行业务调度系统

    9. **设计模式**:在构建银行业务调度系统时,可能会用到一些设计模式,如工厂模式(创建窗口线程)、观察者模式(窗口状态变化通知)、责任链模式(处理不同类型的业务请求)等,它们能帮助我们写出更清晰、可维护...

    23种设计模式说明和代码模板

    包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式等。 设计模式是程序设计中针对特定问题的常见解决方案,它们不是具体的...

    design-patterns-in-java

    10. 责任链模式:将请求的发送者和接收者解耦,多个对象形成一个处理链,请求沿着链传递,直到有对象处理它。 以上就是"design-patterns-in-java"项目中涉及的主要设计模式。通过实际的Java代码示例,你可以更好地...

    DHDesignPatternsPracticesII

    在Java中,命令模式可以结合责任链模式实现更复杂的请求处理。 以上只是《DHDesignPatternsPracticesII》项目可能涉及的一部分设计模式。通过这个项目,开发者不仅可以学习到如何在实际项目中应用这些模式,还能...

Global site tag (gtag.js) - Google Analytics