proxy pattern & adapter pattern & decorator pattern
proxy design pattern
例子:网络连通性问题时候player可以用一个ProxyPlayer代替
proxy类经常有is-a 和 has-a 的讨论。
- 你可以实现PlayerProxy是一个完全独立的类包含一个Player对象,这个设计是合理的如果PlayerProxy总是被程序调用当它想和一个Player对象talk.
- 或者,可以实现PlayerProxy是Player子类,重现函数需要网络连通性的。
class PlayerProxy: public Player
{
public:
virtual string sendInstantMessgae(const string & inMessage) const;
};
The adapter pattern
潜在的抽象不能被改变,但是它不适用于当前的设计。在这个例子中,可以构建一个adapter或warpper class。
STL用adapter模式实现stack,queue借助其它容器,比如deque,list。
The decorator pattern
这个模式用来改变物体的运行时状态。
比如BoldParagraph, ItalicParagraph, BoldItalicParagraph,Paragraph。
#include <string>
#include <iostream>
using namespace std;
class Paragraph
{
public:
Paragraph(const string& inInitialText) : mText(inInitialText) {}
virtual string getHTML() const { return mText; }
protected:
string mText;
};
class BoldParagraph : public Paragraph
{
public:
BoldParagraph(const Paragraph& inParagraph) :
Paragraph(""), mWrapped(inParagraph) {}
virtual string getHTML() const {
return "<B>" + mWrapped.getHTML() + "</B>";
}
protected:
const Paragraph& mWrapped;
};
class ItalicParagraph : public Paragraph
{
public:
ItalicParagraph(const Paragraph& inParagraph) :
Paragraph(""), mWrapped(inParagraph) {}
virtual string getHTML() const {
return "<I>" + mWrapped.getHTML() + "</I>";
}
protected:
const Paragraph& mWrapped;
};
int main()
{
Paragraph p("A party? For me? Thanks!");
// Bold
cout << BoldParagraph(p).getHTML() << endl;
// Bold and Italic
cout << ItalicParagraph(BoldParagraph(p)).getHTML() << endl;
// Bold and Bold
cout << BoldParagraph(BoldParagraph(p)).getHTML() << endl;
return 0;
}
Observer pattern
Event handling.