Nội dung
Bridge là một mẫu thiết kế cấu trúc chia logic nghiệp vụ hoặc lớp khổng lồ thành các cấu trúc phân cấp lớp riêng biệt có thể được phát triển độc lập.
Một trong những cấu trúc phân cấp này (thường được gọi là Trừu tượng) sẽ nhận được một tham chiếu đến một đối tượng của cấu trúc phân cấp thứ hai (Hiện thực). Phần trừu tượng sẽ có thể ủy quyền một số (đôi khi, hầu hết) các lệnh gọi của nó cho đối tượng hiện thực. Vì tất cả các hiện thực sẽ có một giao diện chung nên chúng có thể hoán đổi cho nhau bên trong phần trừu tượng.
Cách sử dụng mẫu
Sử dụng: Mẫu Bridge đặc biệt hữu ích khi xử lý các ứng dụng đa nền tảng, hỗ trợ nhiều loại máy chủ cơ sở dữ liệu hoặc làm việc với một số nhà cung cấp API thuộc một loại nhất định (ví dụ: nền tảng đám mây, mạng xã hội, v.v.)
Nhận dạng: Bridge có thể được nhận ra bởi sự phân biệt rõ ràng giữa một số thực thể kiểm soát và một số nền tảng khác nhau mà nó dựa vào.
Chương trình mẫu
Program.cs
using System;
namespace DesignPatterns.Bridge.Conceptual
{
// Abstraction định nghĩa giao diện cho phần "điều khiển" của hai phân cấp
// lớp. Nó duy trì một tham chiếu đến một đối tượng của hệ thống phân cấp
// Implementation và ủy quyền tất cả công việc thực cho đối tượng này.
class Abstraction
{
protected IImplementation _implementation;
public Abstraction(IImplementation implementation)
{
this._implementation = implementation;
}
public virtual string Operation()
{
return "Abstract: Base operation with:\n" +
_implementation.OperationImplementation();
}
}
// Có thể mở rộng Abstraction mà không cần thay đổi các lớp Implementation.
class ExtendedAbstraction : Abstraction
{
public ExtendedAbstraction(IImplementation implementation) : base(implementation)
{
}
public override string Operation()
{
return "ExtendedAbstraction: Extended operation with:\n" +
base._implementation.OperationImplementation();
}
}
// Implementation xác định giao diện cho tất cả các lớp hiện thực. Nó không nhất
// thiết phải phù hợp với giao diện của Abstraction. Trên thực tế, hai giao diện
// có thể hoàn toàn khác nhau. Thông thường, giao diện Implementation chỉ cung
// cấp các hoạt động nguyên thủy, trong khi Abstraction xác định các hoạt động
// cấp cao hơn dựa trên các nguyên thủy đó.
public interface IImplementation
{
string OperationImplementation();
}
// Mỗi Concrete Implementation tương ứng với một nền tảng cụ thể và triển
// khai giao diện Implementation bằng cách sử dụng API của nền tảng đó.
class ConcreteImplementationA : IImplementation
{
public string OperationImplementation()
{
return "ConcreteImplementationA: The result in platform A.\n";
}
}
class ConcreteImplementationB : IImplementation
{
public string OperationImplementation()
{
return "ConcreteImplementationA: The result in platform B.\n";
}
}
class Client
{
// Ngoại trừ giai đoạn khởi tạo, trong đó một đối tượng Abstraction được liên
// kết với một đối tượng Implementation cụ thể, Client chỉ nên phụ thuộc vào
// lớp Abstraction . Bằng cách này, Client có thể hỗ trợ bất kỳ kết hợp
// hiện thực - trừu tượng nào.
public void ClientCode(Abstraction abstraction)
{
Console.Write(abstraction.Operation());
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client();
Abstraction abstraction;
// Client phải có thể hoạt động với bất kỳ tổ hợp hiện thực - trừu tượng
// nào được định cấu hình trước.
abstraction = new Abstraction(new ConcreteImplementationA());
client.ClientCode(abstraction);
Console.WriteLine();
abstraction = new ExtendedAbstraction(new ConcreteImplementationB());
client.ClientCode(abstraction);
}
}
}
Kết quả
Abstraction: Base operation with:
ConcreteImplementationA: Here's the result on the platform A.
ExtendedAbstraction: Extended operation with:
ConcreteImplementationB: Here's the result on the platform B.
Để lại một bình luận