一、什么是函数对象
①、类中只有唯一的一个方法,没有成员变量。
②、该方法输入参数是其他类。
③、内部逻辑是调用其他类的方法,完成某些任务。
示例:比较两个String对象的长度。
public class StrLenCompare{
public int compare(String first,String second){
return first.length - second.length;
}
}
这就是一个简单的函数对象。该类就是指向该方法的指针。 - -
那么我们可以创建多种比较方式的类(比较字符串的大小,首字母大小等)。这就形成了策略模式的雏形。
二、优化函数对象
将其作为单例(Singleton)模式
public class StrLenCompare {
private StrLenCompare(){};
//设置为公共的不可变成员变量
public static final StrLenCompare STR_LEN_COMPARE = new StrLenCompare();
public int compare(String first,String second){
return first.length() - second.length();
}
}
如果其他类想使用其他的Compare方法的话,就必须得有一个接口,作为Compare类的父类。
所以说我们,需要先创建一个Compare接口
public interface Comparable<T>{
int comparable (T a,Tb);
}
然后让StrLenCompare继承该接口public class StrLenCompare implements Compareble<String>{
private StrLenCompare() {
// TODO Auto-generated constructor stub
}
public static final StrLenCompare STR_LEN_COMPARE = new StrLenCompare();
@Override
public int comparable(String a, String b) {
// TODO Auto-generated method stub
return a.length() - b.length();
}
}
使用:public class StringTest {
private String s1;
private String s2;
public StringTest(String s1,String s2) {
// TODO Auto-generated constructor stub
this.s1 = s1;
this.s2 = s2;
}
//这样就能传入不同的Compareble对象比较两个字符串了
public void compare(Compareble<String> compare){
compare.comparable(s1, s2);
}
}
总结:策略模式
①、需要有个一共同的策略接口
②、具体策略继承该策略接口
③、当该具体策略只被使用一次的使用,一般都使用匿名类来创建
④、当被某个类使用多次的时候,就需要将该具体策略设为该类私有的,并设置静态常量让其导出
⑤、当被多个类重复使用的时候,将该具体策略设置为Singleton