我一直在思考一个问题但是一直没有想到答案,我想我有些明白了。
public class SimpleWrapper implements Wrapper, Pipeline
为什么SimpleWrapper要实现Wrapper和Pipeline这两个接口呢?首先我们要知道Wrapper和Pipeline这两个接口是做什么的?
在整个流程中:
A.Wrapper->SimpleWrapper->SimpleWrapper.pipeline.SimpleWrapperValve
B.SimpleWrapper->allocate()->loadServlet()->getLoader(Wrapper.setLoader)
C.Pipeline->SimplePipeline->getBasic()->setBasic()->getValves->removeVales
我们将B的操作抽象出来就是Wrapper。
我们将C的操作抽象出来就是Pipeline,其实现类就是SimplePipeline,我们用XXX方式引入:
private SimplePipeline pipeline = new SimplePipeline(this);
在这个阶段中,我们主要实现的是Wrapper的功能,所以我们的实现类是SimpleWrapper,但是同时我们又要实现Pipeline的功能,所以就有了:
public class SimpleWrapper implements Wrapper, Pipeline
这样做我认为有如下几个优点:
1.SimpleWrapper不会有遗漏方法(遗漏编译不通过),内部实现是:
pipeline.getBasic();
其实还是相当于直接对Pipeline进行操作。
2.作为一个设计者我们没有必要让开发人员知道SimpleWrapper内部所有的方法(因为有很多的方法他们永远用不到),所以开发人员定义往往是这样的:
Pipeline pipeline = new SimpleWrapper();
到了下一个开发人员手里的时候又会是这样:
Wrapper wrapper = new SimpleWrapper();
但是这个时候我要用pipeline的方法呢?当然就是这样了:
((Pipeline)SimpleWrapper).xxxXXX();
因为((Pipeline)SimpleWrapper).xxxXXX();实际调用的是
SimpleWrapper.xxxXXX();它的内部实现是:pipeline.xxxXXX();
小结:满足上述两点必须
1. implements Wrapper, Pipeline
2. Pipeline pipeline = new SimpleWrapper();
这些也许就是抽象了,最笨的办法就是把SimpleWrapper直接抽象出一个接口,哈哈,这样就没有层次了。如果其他类要用pipeline的一个方法就必须把SimpleWrapper接口都拿过去。3. SimpleWrapperValve只有一个invoke方法,只要是为了调用service方法。