今天来谈一下目前的代码中是如何使用组合模式的。
以下是matcher部分的类图和组合模式的类图:
Component是组合模式中的接口,它应该包含所有公共的行为,有这样一个接口,方便访问和管理继承这个接口的组件。
Composite是子部件,composite后面还可以有叶子节点,在composite中可以实现子部件应该有的行为。
Leaf是叶子节点,叶子节点是没有子节点的。
根据matcher的类图对比组合模式可以发现,RequestMatcher就是Component,在RequestMatcher中我们有match方法,AndRequestMatcher、OrRequestMatcher是叶子节点,他们分别实现了自己的match方法,AbstractContentMatcher相当于Composite组件,这个类中有自己的doMatch方法是别的类不需要拥有的。再往下的三个类:ContentMatcher、UriRequestMatcher、XPathRequestMatcher在组合模式的这棵树中,都是叶子节点。均继承了AbstractContentMatcher,实现了doMatch方法。很标准的一个组合模式。
组合模式的好处就是可以很清晰的表达出这几个类的部分-整体的组织结构,可以通过对这个组合整体进行统一操作,而忽略对单一的个体进行操作。操作Component和Composite即可。