Bridge Pattern là gì?
- Bridge Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern).
- Ý tưởng của nó là tách tính trừu tượng (abstraction) ra khỏi tính hiện thực (implementation) của nó. Từ đó có thể dễ dàng chỉnh sửa hoặc thay thế mà không làm ảnh hưởng đến những nơi có sử dụng lớp ban đầu.
Sử dụng Bridge Pattern khi nào?
- Khi bạn muốn tách ràng buộc giữa Abstraction và Implementation, để có thể dễ dàng mở rộng độc lập nhau.
- Cả Abstraction và Implementation của chúng nên được mở rộng bằng subsclass.
- Sử dụng ở những nơi mà những thay đổi được thực hiện trong implement không ảnh hưởng đến phía client.
Cài đặt Bridge Pattern
- Abstraction : định nghĩa giao diện của lớp trừu tượng, quản lý việc tham chiếu đến đối tượng hiện thực cụ thể (Implementation).
abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw(); // Phương thức vẽ
}
- Implementor : định nghĩa giao diện cho các lớp hiện thực. Thông thường nó là interface định ra các tác vụ nào đó của Abstraction.
interface DrawAPI {
void drawCircle(int radius, int x, int y);
void drawRectangle(int width, int height, int x, int y);
}
- Refined Abstraction: hiện thực (implement) các phương thức đã được định ra trong Abstraction bằng cách sử dụng một tham chiếu đến một đối tượng của Implementer.
- ConcreteImplementor : kế thừa Implementor và định nghĩa chi tiết hàm thực thi.
class Circle extends Shape {
private int radius;
private int x, y;
public Circle(int radius, int x, int y, DrawAPI drawAPI) {
super(drawAPI);
this.radius = radius;
this.x = x;
this.y = y;
}
@Override
public void draw() {
drawAPI.drawCircle(radius, x, y); // Gọi phương thức vẽ của DrawAPI
}
}
class Rectangle extends Shape {
private int width, height, x, y;
public Rectangle(int width, int height, int x, int y, DrawAPI drawAPI) {
super(drawAPI); //lưu trữ về Implementor
this.width = width;
this.height = height;
this.x = x;
this.y = y;
}
@Override
public void draw() {
drawAPI.drawRectangle(width, height, x, y); // Gọi phương thức vẽ của DrawAPI
}
}
class RedDrawAPI implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle with radius " + radius + " at (" + x + ", " + y + ") using Red color");
}
@Override
public void drawRectangle(int width, int height, int x, int y) {
System.out.println("Drawing Rectangle with width " + width + " and height " + height + " at (" + x + ", " + y + ") using Red color");
}
}
class BlueDrawAPI implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle with radius " + radius + " at (" + x + ", " + y + ") using Blue color");
}
@Override
public void drawRectangle(int width, int height, int x, int y) {
System.out.println("Drawing Rectangle with width " + width + " and height " + height + " at (" + x + ", " + y + ") using Blue color");
}
}
public class Main {
public static void main(String[] args) {
Shape redCircle = new Circle(10, 100, 100, new RedDrawAPI());
Shape blueRectangle = new Rectangle(20, 30, 200, 200, new BlueDrawAPI());
redCircle.draw(); // Vẽ hình tròn với màu đỏ
blueRectangle.draw(); // Vẽ hình chữ nhật với màu xanh
}
}
Lợi ích của Bridge Pattern là gì?
- Giảm sự phục thuộc giữa abstraction và implementation (loose coupling)
- Giảm số lượng những lớp con không cần thiết
- Code sẽ gọn gàn hơn và kích thước ứng dụng sẽ nhỏ hơn
- Dễ dàng mở rộng về sau
- Cho phép ẩn các chi tiết implement từ client
Tham khảo
https://viblo.asia/p/bridge-design-pattern-tro-thu-dac-luc-cua-developers-gDVK2oG2ZLj