2020년 7월 7일 화요일

GOF Design Pattern - Adapter





설명

 클래스간의 호환성을 위해서 기존 클래스에 인터페이스를 덧씌우는 것.



예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TextView
{
public:
    TextView() : origin(-1-1), extent(-1-1), isEmpty(true) {}
    void GetOrigin(Coord& o) const { o = origin; }
    void GetExtent(Coord& e) const { e = extent; }
 
    virtual bool IsEmpty() const { return isEmpty; }
 
protected:
    Coord origin;
    Coord extent;
    bool isEmpty;
};
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Shape
{
public:
    Shape() = default;
 
    virtual void BoundingBox(Point& bottomLeft, Point& topRight) const
    {
        bottomLeft = this->bottomLeft;
        topRight = this->topRight;
    }
    virtual class Manipulator* CreateManipulator() const {}
 
protected:
    Point bottomLeft;
    Point topRight;
};
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TextShape_Class : public Shape, private TextView
{
public:
    TextShape_Class() = default;
 
    virtual void BoundingBox(Point& bottomLeft, Point& topRight) const
    {
        Coord origin, extent;
 
        GetOrigin(origin);
        GetExtent(extent);
 
        bottomLeft = Point(origin - (extent / 2));
        topRight = Point(origin + (extent /2));
    }
    virtual Manipulator* CreateManipulator() const { }
 
    virtual bool IsEmpty() const { return TextView::IsEmpty(); }
};
cs    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TextShape_Object : public Shape
{
public :
    TextShape_Object(TextView* var) : _text(var) {};
 
    virtual void BoundingBox(Point& bottomLeft, Point& topRight) const
    {
        Coord origin, extent;
 
        _text->GetOrigin(origin);
        _text->GetExtent(extent);
 
        bottomLeft = Point(origin - (extent / 2));
        topRight = Point(origin + (extent / 2));
    }
    virtual Manipulator* CreateManipulator() const { ; }
 
    virtual bool IsEmpty() const { return _text->IsEmpty(); }
 
private:
    TextView* _text;
};
cs

TextView 라는 클래스가 이미 구현되어 있는데,

Shape 이라는 내가 만든 인터페이스를 거기에 적용하고 싶음.

그래서 TextShape_Class 는 private 로 TextView 를 상속하고 Shape 를 public 으로 상속해서 이를 구현함.

반대로 TextShap_Object 는 TextView 를 멤버로 가지고 Shape 를 상속받아서 이를 구현함.

보통은 후자를 추천함.



추가 설명

 모든 클래스에 다 적용가능함.

댓글 없음:

댓글 쓰기

List