-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Cầu nối tương lai!
Đã bao giờ bạn thắc mắc các thư viện lập trình như java persistence, hay spring data hoạt động như thế nào chưa? Chiếc cầu nào đã kết nối tầng ứng dụng của chúng ta đến các tầng thấp hơn ở bên dưới? Đó chính là nhờ có Bridge design pattern.
Vấn đề thực tế
Chắc hẳn chúng ta ai cũng đã biết đến database rồi, và chắc chắn là tất cả các anh em làm Back-End là phải thường xuyên đọc ghi với database rồi. Câu hỏi đặt ra là làm thế nào để chúng ta có thể giao tiếp với database một cách mềm dẻo, và thậm chí chúng ta có thể thay thế database trong tương lai nếu nó không còn phù hợp nữa? Câu trả lời là chúng ta cần chia source code của chúng ta thành các tầng khác nhau.
Thường khi chúng ta lập trình với Spring thì source code thường được chia thành 5 tầng:
Các tầng trên cùng:
- Tầng controller: là tầng sẽ nhận request và phản hồi response cho client
- Tầng service: là tầng sẽ xử lý nghiệp vụ
- Tầng Repository: là tầng sẽ giao tiếp với với càng tầng thấp hơp để đọc ghi dữ liệu vào database. Khi lập trình với các framework như
spring-data
hayezydata-jpa
thông thường chúng ta chỉ cần quan tâm đến tầng này là đủ
Các tầng ở dưới:
- Tầng pesistence: Đây là tầng sẽ giao tiếp với database driver (ví dụ mysql driver) để đọc ghi dữ liệu vào database và map dữ liệu thành dạng đối tượng cho chúng ta, 2 framework mà chúng ta hay dùng nhất ở tầng này là hibernate và mybatis
- Tầng driver: là tầng mà các nhà cung cấp database sẽ cài đặt các interface của
jdbc
và cung cấp cho thư viện mà chúng ta sẽ gọi nó làconnector
hoặcdriver
Mục tiêu ra đời
Với rất nhiều tầng lớp như vậy, thì Bridge design pattern đã ra đời với các mục tiêu:
- Kết nối các tầng xử lý dữ liệu với nhau, nó xa hơn thì là kết nối các hệ thống với nhau
- Cho phép chúng ta dễ dàng thay việc cài đặt của các tầng mà không ảnh hưởng đến các tầng sử dụng. Ví dụ chúng ta có thể sử dụng MySQL hay Oracle, nhưng lớp Repository của chúng ta vẫn được giữ nguyên, chúng ta chỉ cần thay đổi một chút cấu hình là xong
Giải quyết vấn đề
Nào bây giờ chúng ta sẽ đi viết tằng Persistence và tạo ra một thư viện nhỏ giống kiểu Hibernate. Đầu tiên hãy thiết kế lớp một chút.
Sơ đồ lớp
- PersistenceImplementor: là interface cầu nối (Bridge)
- OraclePersistenceImplementor: là lớp cầu nối gọi đến driver của Oracle
- MySQLPersistenceImplementor: là lớp cầu nối gọi đến driver của MySQL
- Persistence: là interface mà các lớp của tầng Service sẽ sử dụng như một cầu nối để gọi đến cơ sở dữ liệu
- PersistenceImpl: là lớp cài đặt của interface
Persistence
, lớp này sẽ sử dụngPersistenceImplementor
để truy xuất cơ sở dữ liệu. Lớp này sẽ tuỳ thuộc vào việc chúng ta cấu hình lựa chọn database nào để khởi tạoPersistenceImplementor
tương ứng.
Dự theo thiết kế này thì rõ ràng các lớp sử dụng interface Persistence
sẽ không cần phải quan tâm đến các lớp cài đặt phức tạp ở dưới, vậy việc chúng ta thay đổi database là tương đối dễ dàng, chỉ cần thay đổi cấu hình, thế là xong
Source code
Vì thiết kế khá nhiều lớp nên source sẽ hơi phức tạp một chút.
interface Persistence {
public void persist(Entity entity);
public Entity findById(String id);
public void deleteById(String id);
}
// bridge interface
interface PersistenceImplementor {
public void saveEntity(Entity entity);
public void deleteEntity(String entityId);
public Entity getEntity(String entityId);
}
class PersistenceImp implements Persistence {
// bridge object
private PersistenceImplementor implementor;
public PersistenceImp(String databaseType) {
this.implementor = databaseType.equals("MySQL")
? new MySQLPersistenceImplementor()
: new OraclePersistenceImplementor();
}
@Override
public void persist(Entity entity) {
implementor.saveEntity(entity);
}
@Override
public Entity findById(String id) {
return implementor.getEntity(id);
}
@Override
public void deleteById(String id) {
implementor.deleteEntity(id);
}
}
class MySQLPersistenceImplementor implements PersistenceImplementor {
private final Map<String, Entity> entities = new HashMap<>();
@Override
public void saveEntity(Entity entity) {
entities.put(entity.getId(), entity);
}
@Override
public void deleteEntity(String entityId) {
entities.remove(entityId);
}
@Override
public Entity getEntity(String entityId) {
return entities.get(entityId);
}
}
class OraclePersistenceImplementor implements PersistenceImplementor {
private final Map<String, Entity> entities = new HashMap<>();
@Override
public void saveEntity(Entity entity) {
entities.put(entity.getId(), entity);
}
@Override
public void deleteEntity(String entityId) {
entities.remove(entityId);
}
@Override
public Entity getEntity(String entityId) {
return entities.get(entityId);
}
}
Và khi sử dụng sẽ thế này:
// create persistence API
Persistence persistenceAPI = new PersistenceImp(databaseType);
// save an entity
persistenceAPI.persist(new UserEntity("foo", "Mr.Foo"));
UserEntity user = (UserEntity)
// find an entity
persistenceAPI.findById("foo");
// delete an entity
persistenceAPI.deleteById("123456");
Tổng kết
Bridge rõ ràng là một design pattern vô cùng quan trọng, thứ mà đa phần các framework (đặc biệt là spring) rất hay sử dụng, nó giúp chúng ta có thể dễ dàng chia source code của mình thành nhiều tầng khác nhau, từ đó tăng được sử mềm dẻo và khả năng mở rộng dễ dàng về sau này. Hãy nắm chắc nó và các thư viện sẽ nằm trong lòng bàn tay chúng ta.
Tham khảo
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội