首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

我的設計模式之旅[6]:Adapter Pattern 類別適配器 C++/CLI 實作

     編輯:關於C語言

C++/CLI 版類別適配器,利用多重繼承:TriangleDrawAdapter 同時繼承 IDrawStrategy 與 Triangle。

關鍵程式碼

ref class TriangleDrawAdapter : public IDrawStrategy, public Triangle {
public:
    virtual void draw() { paint(); }
};

完整程式碼

#include "stdafx.h"
using namespace System;

interface class IDrawStrategy { void draw(); };
interface class IPaint { void paint(); };

ref class Triangle : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Triangle"); } };
ref class Circle : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Circle"); } };
ref class Square : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Square"); } };

ref class TriangleDrawAdapter : public IDrawStrategy, public Triangle { public: virtual void draw() { paint(); } };
ref class CircleDrawAdapter : public IDrawStrategy, public Circle { public: virtual void draw() { paint(); } };
ref class SquareDrawAdapter : public IDrawStrategy, public Square { public: virtual void draw() { paint(); } };

ref class Grapher {
    IDrawStrategy^ _drawStrategy;
public:
    Grapher() : _drawStrategy(nullptr) {}
    Grapher(IDrawStrategy^ ds) : _drawStrategy(ds) {}
    void drawShape() { if (_drawStrategy != nullptr) _drawStrategy->draw(); }
    void setShape(IDrawStrategy^ ds) { _drawStrategy = ds; }
};

int main() {
    Grapher^ grapher = gcnew Grapher(gcnew TriangleDrawAdapter());
    grapher->drawShape();
    grapher->setShape(gcnew CircleDrawAdapter());
    grapher->drawShape();
    grapher->setShape(gcnew SquareDrawAdapter());
    grapher->drawShape();
}

C++/CLI 支援多重繼承(介面與 ref class),適合實作類別適配器;後續將展示 Template 版改良,消除類別爆炸問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved