Modern C++ Design Pattern/Chatper 7. 브릿지

created : 2020-04-07T11:44:17+00:00
modified : 2020-09-26T14:19:52+00:00
cpp bridge

Bridge Pattern

Pimpl (Pointer to Implmentation)

    struct Person
    {
      string name;
      void greet();

      Person();
      ~Person();

      class PersonImpl;
      PersonImpl *impl; // refer to gsl::owner<T>
    };

    struct Person:PersonImpl
    {
      void greet(Person* p);
    }

    Person::Person()
      : impl(new PersonImpl) {}

    Person::~Person() { delete imple; }

    void Person::greet()
    {
      impl->greet(this);
    }

    void Person::PersonImpl::greet(Person* p)
    {
      printf("hello %s", p->name.c_str());
    }

Bridge Pattern

    struct Renderer
    {
      virtual void render_circle(float x, float y, float radius) = 0;
    };

    struct VectorRenderer : Renderer
    {
      void render_circle(float x, float y, float radius) override
      {
        cout << "Rasterizing circle of radius " << radius << endl;
      }
    };

    struct RasterRenderer : Renderer
    {
      void render_circle(float x, float y, float radius) override
      {
        cout << "Drawing a vector circle of radius " << radius << endl;
      }
    };

    struct Shape
    {
    protected:
      Renderer& renderer;
      Shape(Renderer& renderer) : renderer{ renderer } {}
    public:
      virtual void draw() = 0;
      virtual void resize(float factor) = 0;
    };

    struct Circle : Shape
    {
      float x, y, radius;

      void draw() override
      {
        renderer.render_circle(x, y, radius);
      }

      void resize(float factor) override
      {
        radius += factor;
      }

      Circle(Renderer& renderer, float x, float y, float radius)
        : Shape{renderer}, x{x}, y{y}, radius{radius} {}
    };

Summary