10.7 适配器模式
适配器(Adapter)模式接受一种类型并且提供一个对其他类型的接口。当给定一个库或者具有某一接口的一段代码,同时还给定另外一个库或者与前面那段代码的基本思想相同的一段代码而只是表达方式不一致时,适配器模式将十分有用。通过调整彼此的表达方式以适配彼此,将会迅速产生解决方法。
假设有个产生斐波那契数列的发生器类,如下所示:
由于它是一个发生器,可以调用operator()来使用它,如下所示:
也许读者希望利用这个发生器来执行STL数值算法操作。遗憾的是,STL算法只能使用迭代器才能工作,这就存在接口不匹配的问题。解决方法就是创建一个适配器,它将接受FibonacciGenerator并产生一个供STL算法使用的迭代器。由于数值算法只要求一个输入迭代器,该适配器模式相当地直观(为了某种目的,它产生了一个STL迭代器,如下所示):
通过被告知斐波那契数列的长度来初始化FibonacciAdapter。当创建iterator时,它仅获得一个包含FibonacciAdapter的引用,这样它就能够访问FibonacciGenerator和length。注意,相等比较忽略了右边的值,因为惟一重要的问题是判断发生器是否达到其长度。此外,operator++()没有修改迭代器;改变FibonacciAdapter状态的惟一操作是调用发生器FibonacciGenerator中的函数operator()。我们在迭代器的这个极其简单的版本上是侥幸成功的,因为对输入迭代器的约束条件十分严格;特别是,在该序列中每个值只能读取一次。
在函数main()中,可以看到所有4类不同的数值算法同FibonacciAdapter一起成功地通过了测试。