Adpater(适配器)模式接受一种类型并提供其他类型的接口。它用在具相同思想的的,只是表达方式不同的类或函数中。
例如:斐波那契数列发生类
#ifndef FIBONACCIGENERATOR_H
#define FIBONACCIGENERATOR_H
class FibonacciGenerator {
int n;
int val[2];
public:
FibonacciGenerator() : n(0) { val[0] = val[1] = 0; }
int operator()() {
int result = n > 2 ? val[0] + val[1] : n > 0 ? 1 : 0;
++n;
val[0] = val[1];
val[1] = result;
return result;
}
int count() { return n; }
};
#endif // FIBONACCIGENERATOR_H ///:~
调用operator()来使用它。下面是使用Adpater模式的实现代码
include <iostream>
#include <numeric>
#include "FibonacciGenerator.h"
#include "../C06/PrintSequence.h"
using namespace std;
class FibonacciAdapter { // Produce an iterator
FibonacciGenerator f;
int length;
public:
FibonacciAdapter(int size) : length(size) {}//通过斐波那契数列的长度来初始化类。它对输入迭代器的约束条件比较严格
class iterator;
friend class iterator;
class iterator : public std::iterator<
std::input_iterator_tag, FibonacciAdapter, ptrdiff_t> {
FibonacciAdapter& ap;
public:
typedef int value_type;
iterator(FibonacciAdapter& a) : ap(a) {}
bool operator==(const iterator&) const {
return ap.f.count() == ap.length;
}
bool operator!=(const iterator& x) const {
return !(*this == x);
}
int operator*() const { return ap.f(); }
iterator& operator++() { return *this; }
iterator operator++(int) { return *this; }
};
iterator begin() { return iterator(*this); }
iterator end() { return iterator(*this); }
};
int main() {
const int SZ = 20;
FibonacciAdapter a1(SZ);
cout << "accumulate: "
<< accumulate(a1.begin(), a1.end(), 0) << endl;
FibonacciAdapter a2(SZ), a3(SZ);
cout << "inner product: "
<< inner_product(a2.begin(), a2.end(), a3.begin(), 0)
<< endl;
FibonacciAdapter a4(SZ);
int r1[SZ] = {0};
int* end = partial_sum(a4.begin(), a4.end(), r1);
print(r1, end, "partial_sum", " ");
FibonacciAdapter a5(SZ);
int r2[SZ] = {0};
end = adjacent_difference(a5.begin(), a5.end(), r2);
print(r2, end, "adjacent_difference", " ");
} ///:~
Template Method(模板模式)通过调用基类的不同函数来驱动程序运行。 它的一个重要特征:定义在基类中(有时作为一个私有成员函数)并且不能改动。例如:
#include <iostraem>
using namespace std;
class ApplicationFrameword{
protected:
virtral void custmoize1()= 0;
virtral void custmoize2()=0;
public:
void templateMethod()
{
for(int i =0;i <5; ++i)
{
custmoize1();
custmoize2();
}
}
};
//create a new "application"
class MyApp:public ApplicationFramework{
protected:
void custmoize1()
{
cout << "Hello";
}
void custmoize2()
{
cout << "World!"<<endl;
}
int main()
{
MyApp app;
app.templateMethod();
}
驱动应用程序运行的“引擎”就是模板方法模式。在GUI中,这个引擎就是主要的时间环,客户端只要提供customize1()和custmoize2()的定义就可以运行程序。
}
}