CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Tìm hiểu Bridge Design Pattern với ví dụ sử dụng ngôn ngữ C#

Đăng lúc: 08:57 PM - 06/12/2022 bởi Charles Chung - 316

Bridge là một mẫu thuộc nhóm Structures Pattern, theo định nghĩa của Gang of Four thì Bridge sẽ tách sự trừu tượng hóa khỏi việc thực thi nó để cả hai có thể thay đổi độc lập.

1. Ý tưởng :

Tách phần trừu tượng (abstraction) ra khỏi phần thực 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. Bridge Patern được sử dụng khi:

  • 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.

2. Ví dụ

  • Giả sử bạn muốn thực hiện các thao tác bật/tắt/chọn kênh cho 2 loại tivi là sony và samsung, lúc này bạn sẽ tổ chức thực thi bật/tắt/chọn kênh cho 2 loại tivi ở implement layer, còn phần gọi hành động bật/tắt/chọn kênh cho 2 loại tivi sẽ tổ chức ở abstraction layer, đảm bảo rằng việc mở rộng thêm ở mỗi layer sẽ không ảnh hưởng đến nhau (quan sát hình trên bài viết)

3. Các thành phần trong mẫu Bridge

  • Abstraction (Shape): đị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).
  • Refined Abstraction (Circle, Square): kế thừa Abstraction.
  • Implementation (Color): đị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.
  • ConcreteImplementation (Red, Blue): kế thừa Implementation và định nghĩa chi tiết hàm thực thi.

4. Code demo với C#

Tệp ILEDTV.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// interface làm cầu nối
    /// </summary>
    public interface ILEDTV
    {
        void TurnOn();
        void TurnOff();
        void SetChannel(int channel);
    }
}

Tệp SamsungLedTV.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// Lớp thực thi samsung tv
    /// </summary>
    public class SamsungLedTV:ILEDTV
    {
        public void SetChannel(int channel)
        {
            Console.WriteLine("Samsung Led TV set channel {0}", channel);
        }

        public void TurnOff()
        {
            Console.WriteLine("Samsung Led TV Turn Off");
        }

        public void TurnOn()
        {
            Console.WriteLine("Samsung Led TV Turn On");
        }
    }
}

Tệp SonyLedTV.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// Lớp thực thi sony tivi
    /// </summary>
    public class SonyLedTV : ILEDTV
    {
        public void SetChannel(int channel)
        {
            Console.WriteLine("Sony Led TV set channel {0}",channel);
        }

        public void TurnOff()
        {
            Console.WriteLine("Sony Led TV Turn Off");
        }

        public void TurnOn()
        {
            Console.WriteLine("Sony Led TV Turn On");
        }
    }
}

Tệp RemoteControl.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// lớp trừu tượng thực thi ghép nối
    /// </summary>
    public abstract class RemoteControl
    {
        protected ILEDTV ledTV;
        public RemoteControl(ILEDTV ledTV)
        {
            this.ledTV = ledTV;
        }

        public abstract void TurnOn();
        public abstract void TurnOff();
        public abstract void SetChannel(int channel);
    }
}

Tệp SamsungRemoteControl.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// lớp thực thi ghép nối
    /// </summary>
    class SamsungRemoteControl : RemoteControl
    {
        public SamsungRemoteControl(ILEDTV ledTV):base(ledTV)
        {

        }
        public override void SetChannel(int channel)
        {
            ledTV.SetChannel(channel);
        }

        public override void TurnOff()
        {
            ledTV.TurnOff();
        }

        public override void TurnOn()
        {
            ledTV.TurnOn();
        }
    }
}

Tệp SonyRemoteControl.cs

namespace BridgeDesignPattern
{
    /// <summary>
    /// lớp thực thi ghép nối
    /// </summary>
    public class SonyRemoteControl:RemoteControl
    {
        public SonyRemoteControl(ILEDTV ledTV) : base(ledTV)
        {

        }
        public override void SetChannel(int channel)
        {
            ledTV.SetChannel(channel);
        }

        public override void TurnOff()
        {
            ledTV.TurnOff();
        }

        public override void TurnOn()
        {
            ledTV.TurnOn();
        }
    }
}

Tệp Program.cs

namespace BridgeDesignPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            SonyRemoteControl sonyRemote = new SonyRemoteControl(new SonyLedTV());
            sonyRemote.TurnOn();
            sonyRemote.TurnOff();
            sonyRemote.SetChannel(102);
            SamsungRemoteControl samsungRemote = new SamsungRemoteControl(new SamsungLedTV());
            samsungRemote.TurnOn();
            samsungRemote.TurnOff();
            samsungRemote.SetChannel(202);
        }
    }
}

 

Link tải source code (Google Drive)

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ