在之前的简单工厂模式中,使用了工厂方法来构建不同的算法实现类。在工厂类中使用了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的高扩展类,还可使用状态模式,以后我再研究...
分享到:
相关推荐
上述代码展示了使用枚举时的for循环简化,其中`Direction.values()`方法会返回一个包含所有枚举常量的数组。 结合以上知识点,可见Java泛型和枚举提供了强大的抽象能力,允许程序员编写更加灵活、安全和高效的代码...
自.NET Framework 2.0起,可以使用`System.EventHandler<TEventArgs>`泛型委托,以避免为每个特定事件创建新的委托类型,提高了代码的复用性和灵活性。 5. **CA1004:泛型方法应提供类型参数推理** 泛型方法应该...
本篇文章将深入探讨如何使用 TypeScript 和 Webpack 来构建可复用的单页应用程序(SPA)。 首先,让我们理解 TypeScript 的核心概念。TypeScript 提供了静态类型系统,这意味着在编译时可以发现潜在的类型错误。它...
22. **使用枚举代替常量**:枚举提供类型安全和更好的可读性。 23. **避免空指针异常**:在使用对象前,先进行非空检查。 24. **异常层次结构**:尽量使自定义异常继承自特定的已存在异常,如IOException。 25. *...
2. **DER**:区分编码规则是BER的一个子集,强制使用确定性的编码方式,确保相同的ASN.1数据结构总是编码成相同的字节序列,适合于证书和数字签名等需要唯一编码的场合。 3. **PER**:打包编码规则是为了节省空间而...
C#/ASP.NET编程中,命名规范是代码可读性和维护性的重要组成部分。以下是一些关键的命名规则: 1. **类命名**: - 应遵循Pascal规则,...遵循这些规则,开发者可以编写出更清晰、更易于理解和复用的C#/ASP.NET代码。
21. **枚举类型**:使用enum关键字定义枚举,理解枚举的优势和应用场景。 22. **匿名内部类**:在需要的地方快速创建临时类,简化代码。 23. **Lambda表达式**:Java 8引入的新特性,简化函数式编程,提高代码简洁...
26. **使用枚举类型**:对于固定的常量集合,使用枚举类型替代常量数组或字符串。 27. **异常链**:在捕获异常后抛出新的异常,保留原始异常信息,便于调试。 28. **避免使用过时的API**:及时更新代码,避免使用...
- **用户定义的数据类型**:程序员可以根据需要创建自定义的数据类型,如结构体(STRUCT)、枚举(ENUM)等,增加代码的可读性和复用性。 5. **ST源文件的结构** - **语句**:ST程序由一系列语句组成,包括赋值...
第1章 概述 1 1.1 精心设计的框架所具备的品质 2 ...B.4.6 与使用规范有关的FxCop规则 287 B.4.7 与设计模式有关的FxCop规则 291 附录C API规范样例 292 术语表 299 推荐读物 303 索引 305
7. **枚举**:Java 5引入的枚举类型,提高了常量集合的使用体验。 以上是对Java的概述和基本语法规则的详细介绍,对于初学者来说,理解和掌握这些基础知识是迈进Java世界的第一步。通过深入学习和实践,可以逐步...
8. **常量与枚举**:尽量使用const关键字来表示不可修改的值,使用枚举代替魔法数字,增加代码可读性。 9. **避免使用全局变量**:全局变量可能导致意外的副作用,尽量使用局部变量或静态成员代替。 10. **函数...
通过打开和分析这个文件,我们可以看到如何使用易语言的命令来枚举文件,以及如何实现基于多个条件的排序算法。这些命令可能包括读取文件信息、比较文件属性、设置排序规则等。 在深入研究这个实例时,我们可以关注...
《设计模式:可复用面向对象软件的基础》 设计模式是软件工程中的一种重要概念,它代表了在特定上下文中解决常见问题的经验总结。这些模式是经过时间和实践验证的解决方案,能够帮助开发者创建更加灵活、可维护和可...
在"sgs java implement"中,开发者可能使用枚举和接口来定义一套规则或者状态,每个枚举值代表一种特定的状态,同时这些枚举值可能还需要实现某些通用的行为,这时候接口就派上用场了。通过让枚举类型实现接口,可以...
2. 生成技术:利用可复用的模式,通过生成器产生新程序,如代码模式和规则模式。 【领域工程】 领域工程是软件复用的一个分支,专注于特定领域的软件开发。它包括领域分析、可复用构件开发和建立构件库等活动,...
枚举设计应避免使用负数值,并提供一个零值代表默认或未设置的状态。 5. **名称准则**:命名规则是代码可读性的重要组成部分。建议遵循一致的命名约定,如PascalCase用于类型和公共成员,camelCase用于私有成员。...