`
miracle9i
  • 浏览: 35715 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

使用枚举复用规则

阅读更多

在之前的简单工厂模式中,使用了工厂方法来构建不同的算法实现类。在工厂类中使用了if语句,定义了许多的if规则来判断具体要构造哪个算法实现类,这样调用类无需知道要创建具体的哪个算法实现类。

但在工厂类中仍旧有许多if的分支,怎样消灭这些if呢?

在jdk5.0引入的枚举类型,似乎可以派上用场。

枚举类型可以在一个对象只生成特定的几种对象时候用,每个生成的对象只是单例的时候用。

 

在这里,可以将各种规则定义为枚举对象,实现规则的复用:

public enum CaculateType {
	ADD('+') {
		public Caculation getOpObject() {
			return new OpAdd();
		}
	},
	SUB('-') {
		public Caculation getOpObject() {
			return new OpSub();
		}
	},
	DIV('/') {
		public Caculation getOpObject() {
			return new OpDiv();
		}
	},
	MUL('*') {
		public Caculation getOpObject() {
			return new OpMul();
		}
	};
	private char op;
	private CaculateType(char op) {
		this.op = op;
	}
	public char getOp() {
		return op;
	}
	public abstract Caculation getOpObject();
	public static Caculation getCaculation(char op) {
		for (CaculateType type : CaculateType.values()) {
			if (type.getOp() == op) {
				return type.getOpObject();
			}
		}
		return null;
	}
}

 

 这样,在使用时,通过枚举类的方法就可以了:

Caculation caculation = CaculateType.getCaculation(operator.charAt(0));
caculation.setNumberA(getNumber(numberA));
caculation.setNumberB(getNumber(numberB));
System.out.println("Result  is:"+caculation.caculate());

 

 

照旧,列出相互的耦合关系:

  调用类 枚举类 抽象类 具体算法实现类
调用类   耦合 耦合  
枚举类     耦合 耦合
抽象类        
具体算法实现类     继承  

可以发现,耦合关系上,枚举类取代了工厂类的作用。

引入枚举类的优点:

  • 规则的可复用
  • 避免if代码,只要扩展枚举类就可以扩展规则(高可扩展性)
  • 使用枚举类决定使用何种算法时,同样可扩展

对于范围字段,同样可以使用枚举定义规则:

public interface CheckUsable {
	public boolean isOK(int value);
}

 

枚举类实现此接口,并进行检查:

public enum NumberState implements CheckUsable{
	SMALL(1,100){
		public boolean isOK(int value){
			if(1<value&&value<=100){
				return true;
			}
			return false;
		}
	},BIG(101,Integer.MAX_VALUE){
		public boolean isOK(int value){
			if(value>100){
				return true;
			}
			return false;
		}
	};
	private int min;	
	private int max;
	private  NumberState(int max , int min) {
		this.max = max;
		this.min = min;
	}
	/**
	 * 也可以不返回此State,可以直接返回在何种枚举类型下的算法类
	 * @param value
	 * @return
	 */
	public static NumberState checkProper(int value){
		NumberState Estate = null;//也可以设为default的那个
		for(NumberState state: NumberState.values()){
			if(state.isOK(value)){
				Estate = state;
			}
		}
		return Estate;
	}
}

 

 

OK,一切都是可复用的

 

 

实际上,对于避免if的高扩展类,还可使用状态模式,以后我再研究...

分享到:
评论

相关推荐

    Java语言程序设计教程课件第五章泛型和枚举

    上述代码展示了使用枚举时的for循环简化,其中`Direction.values()`方法会返回一个包含所有枚举常量的数组。 结合以上知识点,可见Java泛型和枚举提供了强大的抽象能力,允许程序员编写更加灵活、安全和高效的代码...

    代码分析策略规则说明

    自.NET Framework 2.0起,可以使用`System.EventHandler&lt;TEventArgs&gt;`泛型委托,以避免为每个特定事件创建新的委托类型,提高了代码的复用性和灵活性。 5. **CA1004:泛型方法应提供类型参数推理** 泛型方法应该...

    使用typescriptwebpack建立前端项目集以生成不同的具有复用性的单页应用

    本篇文章将深入探讨如何使用 TypeScript 和 Webpack 来构建可复用的单页应用程序(SPA)。 首先,让我们理解 TypeScript 的核心概念。TypeScript 提供了静态类型系统,这意味着在编译时可以发现潜在的类型错误。它...

    java编程的常见规则

    22. **使用枚举代替常量**:枚举提供类型安全和更好的可读性。 23. **避免空指针异常**:在使用对象前,先进行非空检查。 24. **异常层次结构**:尽量使自定义异常继承自特定的已存在异常,如IOException。 25. *...

    ASN.1的语法规则和编码规则

    2. **DER**:区分编码规则是BER的一个子集,强制使用确定性的编码方式,确保相同的ASN.1数据结构总是编码成相同的字节序列,适合于证书和数字签名等需要唯一编码的场合。 3. **PER**:打包编码规则是为了节省空间而...

    C#/asp.net 命名规范文档

    C#/ASP.NET编程中,命名规范是代码可读性和维护性的重要组成部分。以下是一些关键的命名规则: 1. **类命名**: - 应遵循Pascal规则,...遵循这些规则,开发者可以编写出更清晰、更易于理解和复用的C#/ASP.NET代码。

    新手入门:写Java程序的三十个基本规则

    21. **枚举类型**:使用enum关键字定义枚举,理解枚举的优势和应用场景。 22. **匿名内部类**:在需要的地方快速创建临时类,简化代码。 23. **Lambda表达式**:Java 8引入的新特性,简化函数式编程,提高代码简洁...

    Java程序的三十个基本规则

    26. **使用枚举类型**:对于固定的常量集合,使用枚举类型替代常量数组或字符串。 27. **异常链**:在捕获异常后抛出新的异常,保留原始异常信息,便于调试。 28. **避免使用过时的API**:及时更新代码,避免使用...

    ST语言规则编程手册全面讲解ST语言

    - **用户定义的数据类型**:程序员可以根据需要创建自定义的数据类型,如结构体(STRUCT)、枚举(ENUM)等,增加代码的可读性和复用性。 5. **ST源文件的结构** - **语句**:ST程序由一系列语句组成,包括赋值...

    NET设计规范-.NET约定、惯用法与模式.part2

    第1章 概述 1 1.1 精心设计的框架所具备的品质 2 ...B.4.6 与使用规范有关的FxCop规则 287 B.4.7 与设计模式有关的FxCop规则 291 附录C API规范样例 292 术语表 299 推荐读物 303 索引 305

    Java的概述与基本语法规则

    7. **枚举**:Java 5引入的枚举类型,提高了常量集合的使用体验。 以上是对Java的概述和基本语法规则的详细介绍,对于初学者来说,理解和掌握这些基础知识是迈进Java世界的第一步。通过深入学习和实践,可以逐步...

    C++编程规范_101条规则、准则与最佳实践

    8. **常量与枚举**:尽量使用const关键字来表示不可修改的值,使用枚举代替魔法数字,增加代码可读性。 9. **避免使用全局变量**:全局变量可能导致意外的副作用,尽量使用局部变量或静态成员代替。 10. **函数...

    文件_枚举_多项排序 增加精易模块的命令而已-易语言

    通过打开和分析这个文件,我们可以看到如何使用易语言的命令来枚举文件,以及如何实现基于多个条件的排序算法。这些命令可能包括读取文件信息、比较文件属性、设置排序规则等。 在深入研究这个实例时,我们可以关注...

    设计模式-可复用面向对象软件的基础

    《设计模式:可复用面向对象软件的基础》 设计模式是软件工程中的一种重要概念,它代表了在特定上下文中解决常见问题的经验总结。这些模式是经过时间和实践验证的解决方案,能够帮助开发者创建更加灵活、可维护和可...

    sgs java imeplement

    在"sgs java implement"中,开发者可能使用枚举和接口来定义一套规则或者状态,每个枚举值代表一种特定的状态,同时这些枚举值可能还需要实现某些通用的行为,这时候接口就派上用场了。通过让枚举类型实现接口,可以...

    软件需求分析的任务PPT学习教案.pptx

    2. 生成技术:利用可复用的模式,通过生成器产生新程序,如代码模式和规则模式。 【领域工程】 领域工程是软件复用的一个分支,专注于特定领域的软件开发。它包括领域分析、可复用构件开发和建立构件库等活动,...

    .NET类库开发的设计准则MSDN汇总

    枚举设计应避免使用负数值,并提供一个零值代表默认或未设置的状态。 5. **名称准则**:命名规则是代码可读性的重要组成部分。建议遵循一致的命名约定,如PascalCase用于类型和公共成员,camelCase用于私有成员。...

Global site tag (gtag.js) - Google Analytics