Item 21主要講述了在java里诬乞,用function object來表示strategy湿右。
有些語言支持function pointers(指向函數(shù)的指針)痰憎,但是java不支持骡澈。在java里锅纺,可以用object reference去達(dá)到類似的效果。
什么是function pointers
函數(shù)的指針在C++中的例子:
int foo()
{
return 5;
}
int goo()
{
return 6;
}
int main()
{
int (*funcPtr)() = foo; // funcPtr 現(xiàn)在指向了函數(shù)foo
funcPtr = goo; // funcPtr 現(xiàn)在又指向了函數(shù)goo肋殴。但是千萬不要寫成funcPtr = goo();這是把goo的返回值賦值給了funcPtr
return 0;
}
java里的替代
在java里囤锉,invoking a method on an object typically performs some operation on that object(對(duì)一個(gè)object調(diào)用一個(gè)method會(huì)在這個(gè)object上面進(jìn)行一些操作)。但是我們也可以通過給method傳入object护锤,對(duì)其他object進(jìn)行操作官地。
我們看看下面這個(gè)class:
class StringLengthComparator {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
這個(gè)class是stateless的:它沒有fields。所以這個(gè)class的所有實(shí)例都是功能上相等的烙懦。一個(gè)StringLengthComparator的實(shí)例就是一個(gè)concrete strategy驱入。
除了concrete strategy,我們還需要strategy interface氯析。否則使用者不能再傳入其他的comparison strategy亏较。
// strategy interface
public interface Comparator<T> {
public int compare(T t1, T t2);
}
concrete strategy常常用anonymous classes定義,比如說:
Arrays.sort(stringArray, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
);
如果concrete strategy會(huì)被反復(fù)用到掩缓,我們可以用private static member class定義這個(gè)concrete strategy雪情,再把這個(gè)class當(dāng)做另一個(gè)class的public static final field,定義成它的strategy interface的類型你辣。
// exporting a concrete strategy
class Host {
private static class StrLenCmp implements Comparator<String>, Serializable {
public int compare() {
return s1.length() - s2.length();
}
}
// returned comparator is serializable
public static final Comparator<String> STRING_LENGTH_COMPARATOR = new StrLenCmp();
... // bulk of class omitted
}
Reference