Design Architecture/Design Pattern

17 Bridge

lipnus 2021. 8. 29. 20:38
반응형

개념과 구현을 분리

 

똑같은 작용을 하는데 이름이 약간 다름

 

Circle이 추가됨

Circle같은게 추가될 수 있으니, Shape를 추가

기존의 디자인을 확장함

 

나쁘지 않아보이지만.. 앞으로 계속 추가된다면?
DP3 추가

클래스 개수가 어마어마하게 늘어나게 된다.

 

커플링이 넘나 쎄다

굳이 같이 있어야 하나? 나눠보자!

 

V에 따라 나눠보자... 음 좆망

 

여기서 abstract는 컨셉(Shape 같은거)를 말하는것
두개로 딲 나눎!
언제까지나 떨어져 있을 수 있는가? 두개가 서로 필요할 때가 있을텐데 어떻게 연결?

 

2번으루. 클라이언트는 Shape로 접근

1이면,

Information이 있는 곳에서 해라 규칙 위반

Encapsulation 위반

Stretegy 패턴이랑 유사

 

abstract, implement를 디커플링하는게 bridge

 

 

그릴때 V1Drawing, V2Drawing 갖다쓰겠다는 이야기인덧

어떻게 쓸지는 Ractangle, Circle이 스스로 알고 있음.

 

Class Client {
    Shape r1, r2;
    Drawing dp;

    dp = new V1Drawing();
    r1 = new Ractangle(dp, 1, 1, 2, 2);
    
    dp = new V2Drawing();
    r2 = new Circle(dp, 2,2,3);

    r1.draw();
    r2.draw();
}

abstract Class Shape {
    abstract public void draw();
    private Drawing dp;
    
    public Shape(Drawing dp) {
        this.dp = dp;
    }

    public void drawLine(double x1, double y1, double x2, double y2) {
        dp.drawLine(x1,y1,x2,y2);
    }

    public void drawCircle(double x, double y, double r) {
        dp.drawCircle(x,y,r);
    }
}

Class Rectangle extends Shape {
    private int _x1, _x2, _y1, _y2;

    public Rectangle(Drawing dp, double x1, double y1, double x2, double y2) {
        super(dp);
        _x1 = x1;
        _x2 = x2;
        _y1 = y1;
        _y2 = y2;
    }

    public void draw() {
        drawLine(_x1, _y1, _x2, _y1);
        drawLine(_x2, _y1, _x2, _y2);
        drawLine(_x2, _y2, _x1, _y2);
        drawLine(_x1, _y2, _x1, _y1);
    }
}

Class Circle extends Shape {
    private int _x, _y, _r;

    public Circle(Drawing dp, double x, double y, double r) {
        super(dp);
        _x = x;
        _y = y;
        _r = r;
    }

    public void draw() {
        drawLine(_x, _y, _r);
    }
}




abstract Class Drawing {
    abstract public void drawLine(double x1, double y1, double x2, double y2);
    abstract public void drawCircle(double x, double y, double r);
}

Class V1Drawing extends Drawing {
    public void drawLine(double x1, double y1, double x2, double y2) {
        DP1.draw_a_line(x1,y1,x1,y2);
    }

    public void drawCircle(double x, double y, double r) {
        DP1.draw_a_circle(x,y,r);
    }
}

Class V2Drawing extends Drawing {
    public void drawLine(double x1, double y1, double x2, double y2) {
        DP2.drawLine(x1,y1,x1,y2);
    }

    public void drawCircle(double x, double y, double r) {
        DP2.drawCircle(x,y,r);
    }
}



Class DP1 {
    public void draw_a_line(double x1, double y1, double x2, double y2) {
        // 버전1 선긋기
    }

    public void draw_a_circle(double x, double y, double r) {
        // 버전1 원그리기
    }
}

Class DP2 {
    public void drawLine(double x1, double y1, double x2, double y2) {
        // 버전2 선긋기
    }

    public void drawCircle(double x, double y, double r) {
        // 버전2 원그리기
    }
}

 

 

 

 

 

어댑터랑 차이?

- 어댑터는 이미 연결불가능한 좆망 디자인을 사후에 연결해주는 것

- 브릿지는 디자인으로 미리 나눠주는 것

 

 

 

반응형

'Design Architecture > Design Pattern' 카테고리의 다른 글

Design Pattern 정리 블로그  (0) 2021.08.31
18강 MVC PATTERN  (0) 2021.08.30
16강 Composite  (0) 2021.08.29
15강 Adapter  (0) 2021.08.29
14강 Decorator  (0) 2021.08.29