2009年4月7日火曜日

etc - decoratorなんとか

新人研修ではC++を学んでおります。
…というのは嘘ですけど、今やらないで何時やるんだ!という気がするので、徐々にブーストしていきたいと思います。あ、でもその前にBlenderのオフ会ですね。

前書いてたDecoratorなんとかは、こんな感じのイメージです。
1ファイル全体を1クラスで処理していくんじゃなくて、頂点ごとの要素と、面ごとの要素を、イテレーターで回せるようにして、O(n)で変換できるような。

ぶっちゃけ、上の抽象クラスにリスト仕込んで回したほうが分かりやすいかもしれない。
もうちょい練ってから実装しよう・・

追記:GoF本は、まだ買ってないので、本家のはどうなってるか、シラネ


#include <iostream>

//------------------------------------------------------------------------
// Decoratorパターン用のインタフェース
//------------------------------------------------------------------------
class IDecorator {
public:
virtual ~IDecorator() {}
virtual void decorate() = 0;
};

//------------------------------------------------------------------------
// Decorator
//------------------------------------------------------------------------

class ConvertEntry : public IDecorator {
public:
ConvertEntry() : m_decorator(NULL) {}

explicit ConvertEntry(IDecorator *decorator) : m_decorator(decorator) {}

virtual ~ConvertEntry() {
if (m_decorator) {
std::cout << "delete" << std::endl;
delete(m_decorator);
}
}

void convert() {
if (m_decorator) { m_decorator->decorate(); }
}

protected:

IDecorator *m_decorator;

};

//------------------------------------------------------------------------
// 種々のコンバート関数
//------------------------------------------------------------------------

class ConvertEntryPoint : public ConvertEntry {
public:
ConvertEntryPoint() {}

void decorate() {
std::cout << "ConvertEntrPointy" << std::endl;
convert();
}
};

class ConvertFuncA : public ConvertEntry {
public:

explicit ConvertFuncA(IDecorator *decorator) :
ConvertEntry(decorator) {}

void decorate() {
std::cout << "ConvertFuncA" << std::endl;
convert();
}
};

class ConvertFuncB : public ConvertEntry {
public:
explicit ConvertFuncB(IDecorator *decorator) :
ConvertEntry(decorator) {}

void decorate() {
std::cout << "ConvertFuncB" << std::endl;
convert();
}
};


//------------------------------------------------------------------------
// 変換対象
//------------------------------------------------------------------------
class ConvertTarget {
public:
ConvertTarget() {
std::cout << "make target" << std::endl;
}

};


//------------------------------------------------------------------------
// コンバーター
//------------------------------------------------------------------------
class Converter {
public:

Converter(IDecorator *decorator, ConvertTarget *target) :
m_decorator(decorator),
m_target(target) {}

virtual ~Converter() {
if (m_decorator) {
std::cout << "delete" << std::endl;
delete(m_decorator);
}
if (m_target) {
std::cout << "delete" << std::endl;
delete(m_target);
}
}

void convert() {
std::cout << "convert" << std::endl;
m_decorator->decorate();
}

private:
IDecorator *m_decorator;
ConvertTarget *m_target;
};



int main(void) {
// decoratorテスト
ConvertTarget *target = new ConvertTarget();
IDecorator *decorator = new ConvertFuncA(new ConvertFuncB(new ConvertEntryPoint()));
Converter *converter = new Converter(decorator, target);
converter->convert();
delete(converter);

return 0;
}

0 件のコメント: