- vừa được xem lúc

[Design Patterns] Bridge Pattern

0 0 20

Người đăng: Thịnh Trần

Theo Viblo Asia

Bridge được sử dụng khi chúng ta cần tách một abstract khỏi class thực thể và khiến cho cả 2 đều trở nên linh động. Bridge được xếp vào nhóm các pattern Kiến Trúc.

Bridge sử dụng một giao diện đóng vai trò như một cầu nối giúp cho các chức năng của class thực thể trở nên độc lập và tách riêng khỏi các class tạo giao diện. Lúc này, cả 2 loại class đều có thể được chỉnh sửa linh động mà không ảnh hưởng lẫn nhau.

Áp dụng triển khai

sơ đồ các class

Ở đây chúng ta có một phần mềm vẽ các hình phẳng 2D có màu sắc khác nhau. Thông thường để đơn giản thì chúng ta chỉ cần có 01 class baseCircle và tạo ra các object hình tròn có thuộc tính màu sắc khác nhau để vẽ. Lúc này, giao diện được sử dụng để vẽ là phương thức draw() của class Circle.

Tuy nhiên lúc này vấn đề nảy sinh là nếu như chúng ta muốn thay đổi cách hoạt động của draw(), thì việc chỉnh sửa sẽ phải thực hiện trực tiếp trên class Circle. Hoặc ví dụ như chúng ta có ý định chỉnh sửa class Circle thì cũng phải coi chừng cái thuộc tính màu sắc kẻo ảnh hưởng đến draw().

Để tách rời giao diện draw()Circle, một bridge được tạo ra bởi interface Drawing. Các class triển khai DrawingRedDrawingGreen sẽ được Circle ủy thác hoàn toàn tác vụ draw() chi tiết. Như vậy, giờ đây chúng ta có thể yên tâm thực hiện những điều chỉnh cần thiết trên Circle mà không gây ảnh hưởng đến giao diện draw() đang hoạt động và ngược lại.

Bước 1

Tạo interface bridge.

bridgepattern/drawingapi/Drawing.java

package bridgepattern.drawingapi; public interface Drawing { public void draw(int x, int y, int radius);
}

Bước 2

Tạo các class triển khai Drawing.

bridgepattern/drawingapi/DrawingGreen.java

package bridgepattern.drawingapi; public class DrawingGreen
implements Drawing { @Override public void draw (int radius, int x, int y) { System.out.println("=== Đang vẽ hình tròn.."); System.out.println("Màu sắc: Xanh lá"); System.out.println("Tọa độ tâm: (" + x + ", " + y + ")"); System.out.println("Bán kính: " + radius); }
}

bridgepattern/drawingapi/DrawingRed.java

package bridgepattern.drawingapi; public class DrawingRed
implements Drawing { @Override public void draw(int x, int y, int radius) { System.out.println("=== Đang vẽ hình tròn.."); System.out.println("Màu sắc: Đỏ"); System.out.println("Tọa độ tâm: (" + x + ", " + y + ")"); System.out.println("Bán kính: " + radius); }
}

Bước 3

Tạo abstract Shape sử dụng giao diện Drawing.

bridgepattern/Shape.java

package bridgepattern; import bridgepattern.drawingapi.Drawing; abstract public class Shape { protected Drawing drawingAPI; protected Shape(Drawing api) { drawingAPI = api; } public abstract void draw();
}

Bước 4

Tạo class Circle mở rộng Shape.

bridgepattern/Circle.java

package bridgepattern; import bridgepattern.drawingapi.Drawing; public class Circle
extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, Drawing api) { super(api); this.x = x; this.y = y; this.radius = radius; } @Override public void draw() { drawingAPI.draw(x, y, radius); }
}

Bước 5

Sử dụng Shape và các class Drawing để vẽ các hình tròn với màu sắc khác nhau.

PatternDemo.java

import bridgepattern.Circle;
import bridgepattern.drawingapi.DrawingGreen;
import bridgepattern.drawingapi.DrawingRed;
import bridgepattern.Shape; public class PatternDemo { public static void main(String[] args) { Shape circleRed = new Circle(100, 100, 10, new DrawingRed()); circleRed.draw(); Shape circleGreen = new Circle(100, 100, 10, new DrawingGreen()); circleGreen.draw(); }
}

Bước 6

Kiểm chứng lại kết quả in ra ở console.

console

=== Đang vẽ hình tròn..
Màu sắc: Đỏ
Tọa độ tâm: (100, 100)
Bán kính: 10
=== Đang vẽ hình tròn..
Màu sắc: XanhTọa độ tâm: (100, 10)
Bán kính: 100

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 67

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 47

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 41

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 75

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 280

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 50