Hướng dẫn Java Design Pattern – Bridge

Chúng tôi rất vui mừng được chia sẻ kiến thức sâu sắc về từ khóa Bridge pattern la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

Một thành phần trong OOP thường có 2 phần: Phần trừu tượng (abstraction) khái niệm các chức năng và phần thực thi (implementation) các chức năng được khái niệm trong phần trừu tượng. Hai phần này liên hệ với nhau thông qua quan hệ thừa hưởng. Những thay đổi trong phần trừu tượng dẫn tới những thay đổi trong phần thực thi.

Bạn Đang Xem: Hướng dẫn Java Design Pattern – Bridge

Bridge Pattern được sử dụng để tách thành phần trừu tượng (abstraction) và thành phần thực thi (implementation) riêng biệt. Do đó, các thành phần này còn có thể thay đổi một cách độc lập mà không tác động ảnh hưởng tới những thành phần khác. Thay vì liên hệ với nhau bằng quan hệ thừa hưởng, hai thành phần này liên hệ với nhau thông qua quan hệ “chứa trong” (object composition).

Bridge Pattern là gì?

Decouple an abstraction from its implementation so that the two can vary independently.

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) thoát 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 vậy mà không làm tác động ảnh hưởng đến những nơi có sử dụng lớp lúc đầu.

Điều đó có tức là, lúc đầu tất cả chúng ta thiết kế một class với rất nhiều xử lý, giờ đây tất cả chúng ta không muốn để những xử lý đó trong class đó nữa. Vì thế, tất cả chúng ta sẽ tạo ra một class khác và move các xử lý đó qua class mới. Khi đó, trong lớp cũ sẽ lưu lại một đối tượng người sử dụng thuộc về lớp mới, và đối tượng người sử dụng này sẽ chịu trách nhiệm xử lý thay cho lớp lúc đầu.

Bridge Pattern khá giống với mẫu Adapter Pattern tại vị trí là sẽ nhờ vào một trong những lớp khác để thực hiện một số xử lý nào đó. Tuy nhiên, ý nghĩa và mục tiêu sử dụng của hai mẫu thiết kế này hoàn toàn khác nhau:

  • Adapter Pattern hay còn gọi là Wrapper pattern được dùng làm chuyển đổi một class/ interface sang một dạng khác có thể sử dụng được. Adapter Pattern giúp các lớp không tương thích hoạt động cùng nhau mà thông thường là không thể.
  • Bridge Pattern được sử dụng được sử dụng để tách thành phần trừu tượng (abstraction) và thành phần thực thi (implementation) riêng biệt.
  • Adapter Pattern làm cho mọi thứ có thể hoạt động với nhau sau thời điểm chúng đã được thiết kế (đã tồn tại). Bridge Pattern nên được thiết kế trước lúc phát triển mạng lưới hệ thống để Abstraction và Implementation có thể thực hiện một cách độc lập.

Thiết lập cấu hình Bridge Pattern ra làm sao?

Một Bridge Pattern gồm có các thành phần sau:

  • Client: thay mặt đại diện cho khách hàng sử dụng các chức năng thông qua Abstraction.
  • Abstraction : định ra một abstract interface quản lý việc tham chiếu đến đối tượng người sử dụng hiện thực cụ thể (Implementor).
  • Refined Abstraction (AbstractionImpl) : hiện thực (implement) các phương thức đã được định ra trong Abstraction bằng phương pháp sử dụng một tham chiếu đến một đối tượng người sử dụng của Implementer.
  • Implementor : định ra các interface cho những 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.
  • ConcreteImplementor : hiện thực Implementor interface.

Ví dụ:

Một mạng lưới hệ thống nhà băng cung cấp các loại tài khoản khác nhau cho khách hàng, chẳng hạn: Checking trương mục và Saving trương mục. Tất cả chúng ta có sơ đồ như sau:

Xem Thêm : Rapper On The Mic tập 2: Delivery trong rap là gì?

Với cách thiết kế như vậy, khi mạng lưới hệ thống cần cung cấp thêm một loại tài khoản khác, tất cả chúng ta phải tạo class mới cho tất cả những nhà băng, số lượng class tăng lên rất nhiều.

Hiện tại, tất cả chúng ta sẽ sử dụng Bridge Pattern để tái cấu trúc lại mạng lưới hệ thống trên như sau:

Với cấu trúc mới như vậy, khi có thêm một loại tài khoản mới, tất cả chúng ta đơn chỉ việc thêm vào một trong những implement mới cho Trương mục, các thành phần khác của Ngân hàng không bị tác động ảnh hưởng. Hoặc cần thêm một nhà băng mới, chẳng hạn VietinBank tất cả chúng ta chỉ việc thêm implement mới cho Ngân hàng, các thành phần khác cũng không bị tác động ảnh hưởng và số lượng class chỉ tăng lên 1.

Code cho chương trên như sau:

Trương mục:

public interface Trương mục { void openAccount(); }

CheckingAccount:

public class CheckingAccount implements Trương mục { @Override public void openAccount() { System.out.println(“Checking Trương mục”); } }

SavingAccount:

public class SavingAccount implements Trương mục { @Override public void openAccount() { System.out.println(“Saving Trương mục”); } }

Ngân hàng:

Xem Thêm : Certificate of conformity (COC) là gì?

public abstract class Ngân hàng { protected Trương mục trương mục; public Ngân hàng(Trương mục trương mục) { this.trương mục = trương mục; } public abstract void openAccount(); }

VietcomBank:

public class VietcomBank extends Ngân hàng { public VietcomBank(Trương mục trương mục) { super(trương mục); } @Override public void openAccount() { System.out.print(“Open your trương mục at VietcomBank is a “); trương mục.openAccount(); } }

TPBank:

public class TPBank extends Ngân hàng { public TPBank(Trương mục trương mục) { super(trương mục); } @Override public void openAccount() { System.out.print(“Open your trương mục at TPBank is a “); trương mục.openAccount(); } }

Client:

public class Client { public static void main(String[] args) { Ngân hàng vietcomBank = new VietcomBank(new CheckingAccount()); vietcomBank.openAccount(); Ngân hàng tpBank = new TPBank(new CheckingAccount()); tpBank.openAccount(); } }

Output của lớp học trên:

Open your trương mục at VietcomBank is a Checking Trương mục Open your trương mục at TPBank is a Checking Trương mục

Lợi ích của Bridge Pattern là gì?

  • Giảm sự phục thuộc giữa abstraction và implementation (loose coupling): tính thừa hưởng trong OOP thường gắn chặt abstraction và implementation lúc build lớp học. Bridge Pattern có thể được dùng làm cắt đứt sự phụ thuộc này và được cho phép tất cả chúng ta chọn implementation phù hợp lúc runtime.
  • Giảm số lượng những lớp con không cấp thiết: một số trường hợp sử dụng tính inheritance sẽ tăng số lượng subclass rất nhiều. Ví dụ: trường hợp lớp học view hình ảnh trên các hệ điều hành khác nhau, ta có 6 quy mô (JPG, PNG, GIF, BMP, JPEG, TIFF) và 3 hệ điều hành (Window, MacOS, Ubuntu). Sử dụng inheritance trong trường hợp này sẽ làm ta thiết kế 18 lớp: JpgWindow, PngWindow, GifWindow, …. Trong những khi ứng dụng Bridge sẽ giảm số lượng lớp xuống 9 lớp: 6 lớp ứng với từng implement của Image và 3 lớp ứng với từng hệ điều hành, mỗi hệ điều hành sẽ gồm một tham chiếu đến đối tượng người sử dụng Image cụ thể.
  • Code sẽ gọn gàn hơn và kích thước ứng dụng sẽ nhỏ hơn: do giảm được số class không cấp thiết.
  • Dễ bảo trì hơn: các Abstraction và Implementation của nó sẽ dễ dàng thay đổi lúc runtime cũng như khi cần thay đổi thêm bớt trong tương lai.
  • Dễ dàng mở rộng về sau: thông thường các ứng dụng lớn thường yêu cầu tất cả chúng ta thêm module cho ứng dụng có sẵn nhưng không được sửa đổi framework/ứng dụng có sẵn vì các framework/ứng dụng đó có thể được tổ chức nâng cấp lên version mới. Bridge Pattern sẽ giúp tất cả chúng ta trong trường hợp này.
  • Được chấp nhận ẩn các cụ thể implement từ client: do abstraction và implementation hoàn toàn độc lập nên tất cả chúng ta có thể thay đổi một thành phần mà không tác động ảnh hưởng đến phía Client. Ví dụ, các lớp của lớp học view ảnh sẽ độc lập với thuật toán vẽ ảnh trong các implementation. Như vậy ta có thể update lớp học xem ảnh khi có một thuật toán vẽ ảnh mới mà không cần thiết phải sửa đổi nhiều.

Sử dụng Bridge Pattern khi nào?

  • Khi chúng ta muốn tách ràng buộc giữa Abstraction và Implementation, để sở hữu 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 tác động ảnh hưởng đến phía client.

Tài liệu tham khảo:

  • https://sourcemaking.com/design_patterns/bridge
  • https://refactoring.guru/design-patterns/bridge
  • https://vi.wikipedia.org/wiki/Bridge_pattern
  • https://www.javatpoint.com/bridge-pattern
  • https://www.tutorialspoint.com/design_pattern/bridge_pattern.htm
  • http://www.thejavageek.com/2016/10/20/bridge-design-pattern-implementation/

Phân mục: Design pattern, Structuaral Pattern Được gắn thẻ: Design pattern, Structuaral Pattern

Phản hồi

phản hồi

You May Also Like

About the Author: v1000