在JAVA中,只要一个方法操作的是类而非接口时,那么我们只能使用这个类及其子类,如果我们想要将此方法应用于不在此继承结构中的某个类,那么一定是不被允许的,接口可以在很大程度上放宽此限制。看如下代码:
package access;
import java.util.*;
class Processor{
public String name(){
return getClass().getSimpleName();
}
Object process(Object input){
return input;
}
}
class Upcase extends Processor{
String process(Object input){
return ((String)input).toUpperCase();
}
}
class Downcase extends Processor{
String process(Object input){
return ((String)input).toLowerCase();
}
}
class Splitter extends Processor{
String process(Object input){
return Arrays.toString(((String)input).split(" "));
}
}
public class Apply {
public static void process(Processor p, Object s){
System.out.println("Using Processor " + p.name());
System.out.println(p.process(s));
}
public static String s =
"Disagreement with beliefs is by definition incorrect";
public static void main(String[] args) {
// TODO Auto-generated method stub
process(new Upcase(),s);
process(new Downcase(),s);
process(new Splitter(),s);
}
}
此程序运行结果为:
上例中有一个Processor类,它有一个name()方法;另外还有一个process()方法,该方法接收输入的参数,修改它的值并产生输出,这个类被作为基类进行扩展,本例中Processor的子类将修改String对象,Apply.process()方法可以接收任何类型的Processor并将其运用到一个Object对象上,然后打印结果。
像这样创建一个能够根据所传递的参数对象的不同而具有不同方法行为的方法,被称作为策略设计模式,这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分,策略就是传递进去的参数对象,它包含要执行的代码。这里Porcessor对象就是一个策略。
解释一下上述例子中的部分函数:
getclass():获得当前对象的类型。
getSimpleName():返回源代码中给出的底层类的简称,这里的简称就是“Upcase”、“Downcase”、“Splitter”。
toUpperCase():全部字符变为大写,返回给新的字符串。
toLowerCase():全部字符变为小写,返回给新的字符串。
Array.toString():返回String类型的字符串并以数组的方式显示。
split():String类的一部分,接收String类型的对象,并以传递进来的参数作为边界,将String类型的对象分割开来。