这个实现判断这个字符串是否和制定的字符串相等。 类似的基本实现还可以有很多。 下面,假如我们希望实现一个Spredicate,它要判断“这个字符串是个小写字符串,或者等于hello”。 我们怎么办呢? 我们当然可以这样:
只不过,这样一来,我们没有重用IsEqual和IsLowercase这两个类的代码,虽然逻辑上我们是和这两个类有重叠。 我们当然也可以直接调用IsEqual和IsLowercase的代码,如:
只不过,这样的代码是过程式的,非常死板。 如果我再有一个IsEqual或者IsCapitalized的逻辑呢?还要再写一个Predicate2类么? 如果你OO有一定功底,一定可以看出,这个代码不符合IOC原则,在不该new的地方new了。 好,知错就改,根据IOC原则,我们重构如下:
构造函数我就不写了。 如此,Predicate1我们就可以写成 new OrPredicate(new IsLowercase(), new IsEqual(“hello”)); 类似的,我们可以加上AndPredicate, NotPredicate, XorPredicate. 这样,基本上就可以覆盖所有的布尔操作了。 我们在写我们自己的Predicate的时候,就根本不必写is函数,甚至可以忘记is函数的存在。我们面对的不再是一个有着一个boolean is(String)签名的接口,而是一个可以通过各种规则组合的类型。 一个Predicate可以简单如new NotPredicate(p),也可以复杂如:
擦擦眼睛,现在,我们等于自己制造出一个可以用一些特定规则组合的类型,而Spredicate的签名甚至都不再重要了。我们的客户程序从操作字符串变成了操作各种Spredicate对象,这已经是更高一级的抽象了。 为了表现这一点,让我们把Spredicate改成abstract class, 并把is()函数改成包私有(这样我们外面的用户程序就再也看不到这个函数了)。
|
正在阅读:函数式组合子逻辑Java parser框架(一)函数式组合子逻辑Java parser框架(一)
2004-12-02 16:42
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键