我们在使用Java的枚举时往往会结合Switch来进行判断以实现不同值的处理,但是我们知道多用switch不是一种很好的代码风格,不利用维护和适应变化,因为这不符合开-闭原则。为此一种方法是用策略模式来重构原有的枚举实现,但是很多时候确实需要用枚举的方法来实现,如一周的天数等等,这也是JDK5.0重新引入枚举的原因。Joshua Bloch在Effective Java(第二版)里提出了一种枚举策略模式 很好的解决了这个问题。
要说明问题最好的办法就是结合例子,比如我们要定义一年的12个月,往往会想到枚举,假设我们要定义一个返回某年某个月的天数的方法,我们知道一个月一般是30,31天,其中2月比较特殊,闰年是28天,其他年份是29天,如果单纯用swtich的话显然不是一种很好的代码风格,这个例子还好,因为我们知道一年12月不会变,但有的枚举可能在今后添加新的类型,这样我们就不得不去修改原有的switch了,明显不符合开--闭原则,影响维护并且容易引入Bug。
这时我们可以利用嵌套枚举和接口结合的方法来实现开闭原则的思想。
public enum Year {
JAN(MonType.BIG), FEB(MonType.SPECIAL), MAR(MonType.BIG), APR(MonType.SMALL), MAY(
MonType.BIG), JUN(MonType.SMALL),//剩余月份略掉;
Year(MonType type) {
this.type = type;
}
private final MonType type;
public int ContainDays(int year) {
return type.countResult(year);
}
private enum MonType implements Count {
BIG {
public int countResult(int num) {
return 31;
}
},
SMALL {
public int countResult(int num) {
return 30;
}
},
SPECIAL {
public int countResult(int num) {
if ((num % 4 == 0 && num % 100 != 0) || (num % 400 == 0)) {
return 28;
} else {
return 29;
}
}
}
}
}
public interface Count {
public int countResult(int num);
}
在上面这段代码里Year枚举的ContainDays方法返回某年某月的天数,因为大月,小月,闰年和非闰年的2月返回的天数都是不一样的,也就是根据输入参数计算的策略可能不一样,这种情况下我们应抽象出接口来适应这种变化,但是要是直接在Year枚举里12月的类型实例一一实现该接口就会带来很多重复代码(代码有臭味了),因为像1,3,5等都是返回31天的,也就是计算方法一样,而如用嵌套枚举(相当于内部类),外层枚举把处理方法委托给了内部枚举,让内部枚举(代表每个月计算天数的不同类型)来具体实现Count接口(用来返回每月天数),则很好的消除了冗余代码,并且今后要是添加其他处理类型,只需再次实现Count接口,原有的代码无需改变,很好的实现了开闭原则。
分享到:
相关推荐
- **策略模式**:通过不同的枚举值实现不同的策略。 - **事件类型**:定义不同的事件类型,在事件驱动系统中非常有用。 #### 六、枚举类型的注意事项 尽管枚举类型提供了很多便利,但在使用时也需要注意以下几点: ...
Java利用策略模式优化过多if else代码 策略模式是一种非常有用的设计模式,可以帮助开发者优化代码,避免过多的if else语句。下面是关于策略模式的知识点总结: 1. 什么是策略模式? 策略模式是一种行为型设计...
21. **策略模式(Strategy)**:定义一系列算法,把它们一个个封装起来,并使它们可以相互替换。在Java中,策略类通常实现同一个接口,客户端可以根据需要选择策略。 22. **模板方法模式(Template Method)**:...
在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和枚举类。下面我们将详细探讨这些不同的实现方式。 1. **简单实现(非线程安全)** 最简单的单例实现...
此外,书中还会深入探讨如何在Java中实现这些模式,包括如何利用Java的面向对象特性,如继承、封装和多态,以及如何利用接口、匿名内部类等特性来优化设计模式的应用。例如,Java的枚举类型可以方便地实现单例模式,...
3. 行为型模式:责任链模式、命令模式、解释器模式、迭代器模式、访问者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和 visitor 模式。这些模式涉及对象之间的交互和行为,有助于提升代码的...
在本文中,我们将深入探讨如何利用Java编程语言来实现一个银行业务调度系统。这个系统的主要目的是模拟银行窗口的排队和调度机制,以有效地处理多个客户请求。我们将关注以下几个关键知识点: 1. **线程与并发**:...
在Java中实现这些设计模式,通常涉及类和接口的巧妙组合,利用继承、封装和多态等面向对象特性。例如,单例模式通常通过私有构造函数、静态内部类或枚举来实现;工厂模式可能包含一个抽象工厂类和一系列具体工厂类;...
Java中的策略模式通常结合接口或者抽象类来实现。 11. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 12. **状态...
13. 策略模式:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,策略对象改变算法的使用。 14. 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录...
此外,本书还可能涵盖了模式之间的相互作用,如组合模式和装饰模式的结合,如何利用策略模式实现灵活的行为选择等。这些都将帮助你更好地理解和掌握设计模式的精髓,从而在实际开发中构建更加优雅、可扩展的系统。 ...
3. **行为型模式**:包括策略模式、模板方法模式、观察者模式、命令模式、迭代器模式、访问者模式、中介者模式、备忘录模式、状态模式、解释器模式和责任链模式。 这些设计模式为软件开发者提供了解决常见问题的...
在Java图形用户界面设计中,可以利用此模式实现平台无关性。 8. **策略模式**:定义一系列算法,并将每个算法封装起来,使它们可以相互替换。Java的Collections框架中的排序策略(Comparator)就是策略模式的应用。...
15. **策略模式**:定义一组算法,并将每一个算法封装起来,使它们可以互相替换。Java中,策略对象作为参数传递,或者通过Context类来选择策略。 16. **状态模式**:允许一个对象在其内部状态改变时改变它的行为,...
例如,单例模式利用Java的静态内部类或枚举来确保类只有一个实例;工厂方法模式通过接口和抽象类实现类的实例化延迟到子类;建造者模式则通过多个步骤构建复杂对象,使得构造过程更加灵活。 PPT中可能详细讲解了每...
例如,单例模式可以利用Java的静态内部类或者枚举来实现线程安全的单例,而工厂模式则可以结合Java的反射机制来动态创建对象。 通过这个"Java设计模式课件",初学者不仅可以系统地学习各种设计模式,还能了解到如何...
21. **策略模式(Strategy)**:定义一系列的算法,并将每个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户。Java中,策略接口和实现类共同完成策略定义。 22. **模板方法模式(Template Method)**...
- 枚举单例模式:利用Java枚举类型实现单例,既简单又安全。 2. **结构型模式**: - 适配器模式:将两个不兼容的接口转换为兼容接口,使原有接口与新接口可以协同工作。 - 桥接模式:将抽象部分与它的实现部分...
在这个Java版本的23种设计模式实现中,我们可以深入理解这些模式并将其应用到实际项目中,提高代码的可读性、可维护性和扩展性。 首先,我们要了解设计模式的三大类:创建型、结构型和行为型。创建型设计模式主要...
静态内部类单例利用JVM保证了类加载的线程安全性,而枚举单例则是一种既简洁又线程安全的实现方式,也是官方推荐的单例实现方式。 ```java public enum Singleton { INSTANCE; // ... } ``` 在使用单例模式时,...