You are on page 1of 18

Structural patterns

> Bridge
TRƯƠNG PHƯỚC HIỆU
Tên gọi khác
Handle/Body

2
Mục đích
Tách rời abstraction khỏi implementation của nó để
cả hai có thể biến đổi độc lập.

3
Motivation
- Khi một abstraction có thể có nhiều implementation
-> Thường dùng kế thừa (inheritance).

Tuy nhiên cách này trong một số trường hợp không đủ linh hoạt. Kế
thừa bind các implementation cố định với các abstraction đã tạo làm
cho khó thay đổi, mở rộng và sử dụng abstraction và các
implementation một cách độc lập.

4
Ví dụ:

Window

XWindow PMWindow

5
Nhược điểm 1: Dùng kế thừa trong trường hợp này bất tiện trong viện mở
rộng Window abstraction để cover nhiều loại window hay nhiều platform.

Window

XWindow PMWindow IconWindow

XIconWindow PMIconWindow

6
Nhược điểm 2: Khiến code bị phụ thuộc platform. Khi tạo window cụ thể,
ta phải tạo object từ một class chứa implementation cụ thể.

Window

XWindow PMWindow IconWindow

XIconWindow PMIconWindow

7
Motivation
◦ Bridge pattern giải quyết các vấn đề này bằng cách tách biệt
Window abstraction và các implementation của nó ra thành 2 cây
phân cấp class riêng biệt. Một cây dùng cho các Window interface
(Window, IconWindow, TransientWindow). Cây còn lại dùng cho
các implementation của window cho các platform riêng biệt, với
class WindowImp là gốc của cây.
◦ Ví dụ ta sẽ có class con XWindowImp cung cấp các implementation
dựa trên X platform.

8
9
Ứng dụng
◦ Muốn tránh bind cố định giữa abstraction và các implementation
của nó.
◦ Cả abstraction và các implementation của nó nên được mở rộng
bằng việc subclass.
◦ -> Bridge pattern giúp ta có thể kết hợp nhiều loại abstraction và implementation với nhau
và mở rộng chúng một cách độc lập.
◦ Sự thay đổi của implementation của một abstraction không tác
động đến các abstraction và các implementation khác; theo đó
code của phần không bị tác động không nên được recompile.

10
Ứng dụng
◦ Có sự gia tăng đáng kể số class theo platform . Theo đó trong cây
class cần thiết phải chia nó ra thành 2 phần.
◦ Khi muốn chia sẻ một implementation cho nhiều object.

11
Cấu trúc

12
Đặc điểm
◦ 1. Tách rời abstraction và implementation
◦ Implementation không được bind cố định theo abstraction. Giúp cho có thể cấu hình
implementation lúc run-time, thậm chí một object có thể thay đổi implementation của nó
lúc run-time.
◦ 2. Tăng khả năng mở rộng
◦ Có thể mở rộng độc lập cây class Abstraction và cây class Implementor.
◦ 3. Che dấu chi tiết implementation khỏi client
◦ Ví dụ như việc chia sẻ các Implementor cho các object và việc thực hiện Reference counting.

13
Triển khai
Cân nhắc những vấn đề sau khi áp dụng Bridge pattern:
◦ 1. Chỉ có một Implementor
Trong trường hợp chỉ có một implementation, việc tách rời và tạo ra
Implementor class là không cần thiết.
Tuy nhiên dùng Bridge pattern trong trường hợp này vẫn có ích khi thay đổi
implementation mà không ảnh hưởng đến các client đang tồn tại – ví dụ không
cần phải recompile, chỉ cần relink.

14
Triển khai
Cân nhắc những vấn đề sau khi áp dụng Bridge pattern:
◦ 2. Sử dụng đúng Implementor
Nếu một Abstraction biết hết tất cả các lớp con của Implementor, có thể khởi
tạo chúng ở constructor, có thể dựa theo parameter truyền vào constructor để
quyết định.
- Ví dụ một collection class hỗ trợ nhiều implementation dựa vào size của nó.
Nếu ít thì dùng linked list implementation nếu nhiều thì dùng hash table
implementation.
Cách khác đó là xác định implementation mặc định và thay đổi nó sau tùy theo
nhu cầu sử dụng.

15
Triển khai
Cân nhắc những vấn đề sau khi áp dụng Bridge pattern:
◦ 2. Sử dụng đúng Implementor
Có thể ủy thác quyết định chọn Implementor cho một đối tượng khác.
- Trong ví dụ Window/WindowImp, ta có thể sử dụng một factory object
(Abstract Factory pattern) để chọn implementation theo platform cụ thể. Một
Window hỏi factory object nên sử dụng WindowImp nào, nó trả lại đúng loại.
Lợi ích của việc dùng factory object này còn là giúp cho Abstraction không bị
ghép trực tiếp đến bất kỳ loại Implementor nào cả.

16
Triển khai
Cân nhắc những vấn đề sau
khi áp dụng Bridge pattern:

◦ 3. Chia sẻ các Implementor

17
Triển khai
Cân nhắc những vấn đề sau khi áp dụng Bridge pattern:
◦ 4. Sử dụng đa kế thừa (C++)
Có thể sử dụng đa kế thừa trong C++ để kết hợp interface và implementation.
- Ví dụ: một class có thể kết thừa public từ Abstraction và kế thừa private từ
một subclass của Implementor. Tuy nhiên cách này dựa trên kế thừa tĩnh, nó
bind implementation cố định theo Abstraction. Do đó dùng đa kế thừa sẽ
không thể triển khai Bridge pattern một cách đúng nghĩa.

18

You might also like