关于好多继承的问题,我们应该如何去理解

我一直在思考一个问题但是一直没有想到答案,我想我有些明白了。

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方法。

原文地址:https://www.cnblogs.com/baoguo/p/1329484.html