您的位置:首页 > 其它

使用面向对象技术替代switch-case和if-else 推荐

2008-03-25 22:40 549 查看
在日常开发中,常常会作一些状态判断,用到swich-case与if-else。在面向对象的环境里,有两种方式可以替代它们。一种是使用继承子类的多态,另一种是使用state模式。它们使用对象的间接性有效地摆脱了传统的状态判断。
举个例子。
Method.java
[align=left]package com.zj.original;[/align]
[align=left] [/align]
[align=left]import com.zj.utils.NoMethodTypeException;[/align]
[align=left] [/align]
[align=left]public class Method {[/align]
[align=left] private int _type;[/align]
[align=left] public static final int POST = 0;[/align]
[align=left] public static final int GET = 1;[/align]
[align=left] public static final int PUT = 2;[/align]
[align=left] public static final int DELETE = 3;[/align]
[align=left] [/align]
[align=left] public Method(int type) {[/align]
[align=left] _type = type;[/align]
[align=left] }[/align]
[align=left] [/align]
public String getMethod() throws
NoMethodTypeException {
[align=left] switch (_type) {[/align]
[align=left] case POST:[/align]
[align=left] return "This is POST method";[/align]
[align=left] case GET:[/align]
[align=left] return "This is GET method";[/align]
[align=left] case PUT:[/align]
[align=left] return "This is PUT method";[/align]
[align=left] case DELETE:[/align]
[align=left] return "This is DELETE method";[/align]
[align=left] default:[/align]
[align=left] throw new NoMethodTypeException();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean safeMethod() {[/align]
[align=left] if (_type == GET)[/align]
[align=left] return true;[/align]
[align=left] else[/align]
[align=left] return false;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean passwordRequired() {[/align]
[align=left] if (_type == POST)[/align]
[align=left] return false;[/align]
[align=left] else[/align]
[align=left] return true;[/align]
[align=left] }[/align]
[align=left]}[/align]
类Method中,存在四个状态Post、Get、Put和Delete。有一个switch-case判断,用于输出四种方法的描述信息;两个if-else判断,分别判断方法是否安全(只有Get方法是安全的),方法是否需要密码(只有Post方法不需要密码)。

1.[/b]使用继承子类多态[/b][/b]
使用继承子类多态的方式,通常对于某个具体对象,它的状态是不可改变的(在对象的生存周期中)。



现在使用四个子类分别代表四种类型的方法。这样就可以使用多态将各个方法的具体逻辑分置到子类中去了。
在抽象基类Method中可以提供创建子类实例的静态方法,当然也可以使用Simple
Factory模式。对于getMethod()方法,延迟到子类中实现;对于safeMethod()方法和passwordRequired()方法,提供一个默认的实现,这个实现应该符合绝大部分子类的要求,这样的话,对于少数不符合默认实现的子类只需override相应方法即可。
<<abstract>>Method.java
[align=left]package com.zj.subclass;[/align]
[align=left] [/align]
[align=left]public abstract class Method {[/align]
[align=left] [/align]
[align=left] public final static Method createPostMethod() {[/align]
[align=left] return new PostMethod();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public final static Method createGetMethod() {[/align]
[align=left] return new GetMethod();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public final static Method createPutMethod() {[/align]
[align=left] return new PutMethod();[/align]
[align=left] }[/align]
[align=left] [/align]
public final static Method createDeleteMethod()
{
[align=left] return new DelMethod();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] abstract public String getMethod();[/align]
[align=left] [/align]
[align=left] public boolean safeMethod() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean passwordRequired() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
}
四个子类分别继承和override相应的方法。
PostMethod.java
[align=left]package com.zj.subclass;[/align]
[align=left] [/align]
[align=left]public class PostMethod extends Method {[/align]
[align=left] @Override[/align]
[align=left] public String getMethod() {[/align]
[align=left] return "This is POST method";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] @Override[/align]
[align=left] public boolean passwordRequired() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
}
GetMethod.java
[align=left]package com.zj.subclass;[/align]
[align=left] [/align]
[align=left]public class GetMethod extends Method{[/align]
[align=left] @Override[/align]
[align=left] public String getMethod() {[/align]
[align=left] return "This is GET method";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] @Override[/align]
[align=left] public boolean safeMethod() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
}
PutMethod.java
[align=left]package com.zj.subclass;[/align]
[align=left] [/align]
[align=left]public class PutMethod extends Method {[/align]
[align=left] @Override[/align]
[align=left] public String getMethod() {[/align]
[align=left] return "This is PUT method";[/align]
[align=left] }[/align]
[align=left]}[/align]
DelMethod.java
[align=left]package com.zj.subclass;[/align]
[align=left] [/align]
[align=left]public class DelMethod extends Method{[/align]
[align=left] @Override[/align]
[align=left] public String getMethod(){[/align]
[align=left] return "This is DELETE method";[/align]
[align=left] }[/align]
}
2.[/b]使用[/b]state[/b]模式[/b][/b]
如果希望对象在生存周期内,可以变化自己的状态,则可以选择state模式。



这里抽象状态为一个接口MethodType,四种不同的状态实现该接口。
<<interface>>MethodType.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public interface MethodType {[/align]
[align=left] String getTypeDescription();[/align]
[align=left] [/align]
[align=left] String getMethodDescription();[/align]
[align=left] [/align]
[align=left] boolean isSafe();[/align]
[align=left] [/align]
[align=left] boolean isRequired();[/align]
}
Post.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public class Post implements MethodType{[/align]
public String
getMethodDescription() {
[align=left] return "This is POST method";[/align]
[align=left] }[/align]
[align=left] [/align]
public String getTypeDescription()
{
[align=left] return "===POST===";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isRequired() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isSafe() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
}
Get.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public class Get implements MethodType{[/align]
public String
getMethodDescription() {
[align=left] return "This is GET method";[/align]
[align=left] }[/align]
[align=left] [/align]
public String getTypeDescription()
{
[align=left] return "===GET===";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isRequired() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isSafe() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
[align=left]}[/align]
Put.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public class Put implements MethodType{[/align]
public String getMethodDescription()
{
[align=left] return "This is PUT method";[/align]
[align=left] }[/align]
[align=left] [/align]
public String getTypeDescription()
{
[align=left] return "===PUT===";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isRequired() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isSafe() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
[align=left]}[/align]
Delete.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public class Delete implements MethodType{[/align]
public String
getMethodDescription() {
[align=left] return "This is DELETE method";[/align]
[align=left] }[/align]
[align=left] [/align]
public String getTypeDescription()
{
[align=left] return "===DELETE===";[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isRequired() {[/align]
[align=left] return true;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean isSafe() {[/align]
[align=left] return false;[/align]
[align=left] }[/align]
}
此时,在类Method中保存一个field表示MethodType,在某对象中,可以随时变化四种已知的状态(具体见runAllMethods()方法)。
Method.java
[align=left]package com.zj.state;[/align]
[align=left] [/align]
[align=left]public class Method {[/align]
[align=left] private MethodType _type;[/align]
[align=left] [/align]
[align=left] public Method() {[/align]
[align=left] _type = null;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public Method(MethodType type) {[/align]
[align=left] _type = type;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public String getMethod() {[/align]
[align=left] return _type.getMethodDescription();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean safeMethod() {[/align]
[align=left] return _type.isSafe();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean passwordRequired() {[/align]
[align=left] return _type.isRequired();[/align]
[align=left] }[/align]
[align=left] [/align]
public void changeType(MethodType type)
{
[align=left] _type = type;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void runAllMethods() {[/align]
[align=left] MethodType[] types = new MethodType[] { new Post(), new Get(),[/align]
[align=left] new Put(), new Delete() };[/align]
[align=left] for (MethodType type : types) {[/align]
[align=left] System.out.println(type.getTypeDescription());[/align]
[align=left] changeType(type);[/align]
[align=left] System.out.println(getMethod());[/align]
[align=left] System.out.println(safeMethod());[/align]
[align=left] System.out.println(passwordRequired());[/align]
[align=left] }[/align]
[align=left] }[/align]
}
3.测试
在测试类中,分别使用上面3中机制展示结果。它们的结果应该是一致的。
Client.java
[align=left]package com.zj.utils;[/align]
[align=left] [/align]
[align=left]public class Client {[/align]
[align=left] static void print(String s) {[/align]
[align=left] System.out.println(s);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] static void print(Boolean b) {[/align]
[align=left] System.out.println(b);[/align]
[align=left] }[/align]
[align=left] [/align]
public static void main(String[] args) throws
NoMethodTypeException {
[align=left] print("===original===");[/align]
[align=left] print("===POST===");[/align]
com.zj.original.Method post1 = new
com.zj.original.Method(
[align=left] com.zj.original.Method.POST);[/align]
[align=left] print(post1.getMethod());[/align]
[align=left] print(post1.safeMethod());[/align]
[align=left] print(post1.passwordRequired());[/align]
[align=left] print("===GET===");[/align]
com.zj.original.Method get1 = new
com.zj.original.Method(
[align=left] com.zj.original.Method.GET);[/align]
[align=left] print(get1.getMethod());[/align]
[align=left] print(get1.safeMethod());[/align]
[align=left] print(get1.passwordRequired());[/align]
[align=left] print("===PUT===");[/align]
com.zj.original.Method put1 = new
com.zj.original.Method(
[align=left] com.zj.original.Method.PUT);[/align]
[align=left] print(put1.getMethod());[/align]
[align=left] print(put1.safeMethod());[/align]
[align=left] print(put1.passwordRequired());[/align]
[align=left] print("===DELETE===");[/align]
com.zj.original.Method del1 = new
com.zj.original.Method(
[align=left] com.zj.original.Method.DELETE);[/align]
[align=left] print(del1.getMethod());[/align]
[align=left] print(del1.safeMethod());[/align]
[align=left] print(del1.passwordRequired());[/align]
[align=left] [/align]
[align=left] print("===subclass===");[/align]
[align=left] print("===POST===");[/align]
com.zj.subclass.Method post2 =
com.zj.subclass.Method
[align=left] .createPostMethod();[/align]
[align=left] print(post2.getMethod());[/align]
[align=left] print(post2.safeMethod());[/align]
[align=left] print(post2.passwordRequired());[/align]
[align=left] print("===GET===");[/align]
[align=left] com.zj.subclass.Method get2 = com.zj.subclass.Method.createGetMethod();[/align]
[align=left] print(get2.getMethod());[/align]
[align=left] print(get2.safeMethod());[/align]
[align=left] print(get2.passwordRequired());[/align]
[align=left] print("===PUT===");[/align]
com.zj.subclass.Method put2 =
com.zj.subclass.Method.createPutMethod();
[align=left] print(put2.getMethod());[/align]
[align=left] print(put2.safeMethod());[/align]
[align=left] print(put2.passwordRequired());[/align]
[align=left] print("===DELETE===");[/align]
com.zj.subclass.Method del2 =
com.zj.subclass.Method
[align=left] .createDeleteMethod();[/align]
[align=left] print(del2.getMethod());[/align]
[align=left] print(del2.safeMethod());[/align]
[align=left] print(del2.passwordRequired());[/align]
[align=left] [/align]
[align=left] print("===state===");[/align]
[align=left] new com.zj.state.Method().runAllMethods();[/align]
[align=left] }[/align]
}
附件:http://down.51cto.com/data/2349612
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐