java多态替换switch_使⽤⾯向对象技术替代switch-case和if-
else
在⽇常开发中,常常会作⼀些状态判断,⽤到swich-case与if-else。在⾯向对象的环境⾥,有两种⽅式可以替代它们。⼀种是使⽤继承⼦类的多态,另⼀种是使⽤state模式。它们使⽤对象的间接性有效地摆脱了传统的状态判断。
举个例⼦。
Method.java
iginal;
importcom.zj.utils.NoMethodTypeException;
publicclassMethod {
privateint_type;
publicstaticfinalintPOST= 0;
publicstaticfinalintGET= 1;
publicstaticfinalintPUT= 2;
publicstaticfinalintDELETE= 3;
publicMethod(inttype) {
_type= type;
}
publicString getMethod()throwsNoMethodTypeException {
switch(_type) {
casePOST:
return"This is POST method";
caseGET:
return"This is GET method";
casePUT:
return"This is PUT method";
caseDELETE:
return"This is DELETE method";
default:
thrownewNoMethodTypeException();
}
}
publicbooleansafeMethod() {
if(_type==GET)
returntrue;
else
returnfalse;
}
publicbooleanpasswordRequired() {
if(_type==POST)
returnfalse;
else
returntrue;
}
}
类Method中,存在四个状态Post、Get、Put和Delete。有⼀个switch-case判断,⽤于输出四种⽅法的描述信息;两个if-else判断,分别判断⽅法是否安全(只有Get⽅法是安全的),⽅法是否需要密码(只有Post⽅法不需要密码)。
1.使⽤继承⼦类多态
使⽤继承⼦类多态的⽅式,通常对于某个具体对象,它的状态是不可改变的(在对象的⽣存周期中)。
现在使⽤四个⼦类分别代表四种类型的⽅法。这样就可以使⽤多态将各个⽅法的具体逻辑分置到⼦类中去了。
在抽象基类Method中可以提供创建⼦类实例的静态⽅法,当然也可以使⽤Simple
Factory模式。对于getMethod()⽅法,延迟到⼦类中实现;对于safeMethod()⽅法和passwordRequired()⽅法,提供⼀个默认的实现,这个实现应该符合绝⼤部分⼦类的要求,这样的话,对于少数不符合默认实现的⼦类只需override相应⽅法即可。
<>Method.java
packagecom.zj.subclass;
publicabstractclassMethod {
publicfinalstaticMethod createPostMethod() {
returnnewPostMethod();
}
publicfinalstaticMethod createGetMethod() {
returnnewGetMethod();
}
publicfinalstaticMethod createPutMethod() {
returnnewPutMethod();
}
publicfinalstaticMethod createDeleteMethod()
{
returnnewDelMethod();
}
abstractpublicString getMethod(); publicbooleansafeMethod() { returnfalse;
}
publicbooleanpasswordRequired() { returntrue;
}
}
四个⼦类分别继承和override相应的⽅法。PostMethod.java
packagecom.zj.subclass; publicclassPostMethodextendsMethod { @Override
publicString getMethod() {
return"This is POST method";
}
@Override publicbooleanpasswordRequired() { returnfalse;
}
}
GetMethod.java
packagecom.zj.subclass; publicclassGetMethodextendsMethod{ @Override
publicString getMethod() {
return"This is GET method";
}
@Override
publicbooleansafeMethod() { returntrue;
}
}
PutMethod.java
packagecom.zj.subclass;
publicclassPutMethodextendsMethod {
@Override
publicString getMethod() {
return"This is PUT method";
}
}
DelMethod.java
packagecom.zj.subclass;
publicclassDelMethodextendsMethod{
@Override
publicString getMethod(){
return"This is DELETE method";
}
}
2.使⽤state模式
如果希望对象在⽣存周期内,可以变化⾃⼰的状态,则可以选择state模式。
这⾥抽象状态为⼀个接⼝MethodType,四种不同的状态实现该接⼝。
<>MethodType.java
packagecom.zj.state;
publicinterfaceMethodType {
String getTypeDescription();
String getMethodDescription();
booleanisSafe();
booleanisRequired();
}
Post.java
packagecom.zj.state;
publicclassPostimplementsMethodType{
publicString
getMethodDescription() {
return"This is POST method";
}
publicString getTypeDescription()
{
return"===POST===";
}
publicbooleanisRequired() { returnfalse;
}
publicbooleanisSafe() {
returnfalse;
}
}
Get.java
packagecom.zj.state; publicclassGetimplementsMethodType{ publicString
java switch case stringgetMethodDescription() {
return"This is GET method";
}
publicString getTypeDescription()
{
return"===GET===";
}
publicbooleanisRequired() { returntrue;
}
publicbooleanisSafe() {
returntrue;
}
}
Put.java
packagecom.zj.state; publicclassPutimplementsMethodType{ publicString getMethodDescription()
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论