方法接收的参数是基类类型的,那只能接收类或者子类。 如果传递的是接口,只需要实现该接口就行。
这个例子来自《Java编程思想》第9章接口的第3节完全解耦。
假设我们有一个接口Processor和一个类Apply:
public interface Processor { ... }
public class Apply {
public static void process( Processor p ) { ... } //这叫策略设计模式
}
- 1
- 2
- 3
- 4
Apply.process()方法将Processor接口作为参数。现在我们有另一个类Filter和它的子类LowPass,HighPass,BandPass:
public class Filter { ... }
public class LowPass extends Filter { ... }
public class HighPass extends Filter { ... }
public class BandPass extends Filter { ... }
- 1
- 2
- 3
- 4
如果Processor是类,那么无论如何Apply.process()不可能操作Filter!而接口Processor和Adapter设计模式则可以实现对Filter的操作:
class FilterAdapter implements Processor {
Filter filter;
public FilterAdapter (Filter filter) {
this.filter = filter;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
我们新建了类FilterAdapter,它由Filter类的对象构造,同时又是一个Processor接口的实现。也就是说,Adapter设计模式的思想是,设计一个类,接收一个我们想操作的类A(Filter),得到一个我们可以操作的类B(Processor接口的实现),这样我们就可以间接操作类A了。通过这种方式,我们完全解耦了接口和并非实现该接口的类。也就是说,在应用该接口的方法中,我们也可以应用并非实现该接口的类上了。
现在我们就可以这样操作Filter了:
Apply.process(new FilterAdapter(new LowPass()));
Apply.process(new FilterAdapter(new HighPass()));
Apply.process(new FilterAdapter(new BandPass()));
- 1
- 2
- 3
设计模式太厉害了!
看完9.6适配接口之后,Adapter设计模式还有另一种不如上面灵活的方式,即如果我们只有一个单独的类Filter:
class AdaptedFilter extends Filter implements Processor { ... }
- 1
接着我们调用:
Apply.process(new AdaptedFilter());
- 1
之所以说不够灵活,是因为我们不能够有Filter的多态了。我们还得为Filter的子类单独写一个适配的类。