第二十一条:函数对象表示策略

一、什么是函数对象

①、类中只有唯一的一个方法,没有成员变量。
②、该方法输入参数是其他类。
③、内部逻辑是调用其他类的方法,完成某些任务。
示例:比较两个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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章