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.

results matching ""

    No results matching ""