Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 388, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

设计模式之Adapter模式和Template Method模式

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()的定义就可以运行程序。
}
}

posted on 2009-04-12 14:02 Benjamin 阅读(270) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理