前言
你了解橋接模式嗎?
橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,其核心思想是將抽象部分與實(shí)現(xiàn)部分分離,使得二者可以獨(dú)立變化。
這種模式特別適用于需要在多個(gè)維度上進(jìn)行擴(kuò)展或變化的場(chǎng)景。
今天我跟大家分享一個(gè)使用橋接模式在 C# 中實(shí)現(xiàn)一個(gè)消息發(fā)送系統(tǒng)的例子。
核心思想
橋接模式的核心思想是將一個(gè)大類(lèi)或一系列緊密相關(guān)的類(lèi)拆分為兩個(gè)獨(dú)立的層次——抽象部分和實(shí)現(xiàn)部分。
這樣做的好處是可以讓這兩個(gè)層次獨(dú)立地?cái)U(kuò)展,而不會(huì)互相影響。
結(jié)構(gòu)和實(shí)現(xiàn)
- 首先,需要定義一個(gè)接口(Implementor)來(lái)表示實(shí)現(xiàn)部分,這個(gè)接口需要定義實(shí)現(xiàn)抽象類(lèi)的方法,但不包含任何抽象類(lèi)的邏輯
- 其次,創(chuàng)建不同的具體的實(shí)現(xiàn)類(lèi)(ConcreteImplementor)
- 然后,定義一個(gè)抽象類(lèi)(Abstraction),它包含對(duì)實(shí)現(xiàn)部分的引用,并提供了客戶端的操作方法
- 創(chuàng)建不同的具體的繼承抽象類(lèi)的類(lèi)型
- 最后,客戶端代碼使用抽象類(lèi),而無(wú)需關(guān)心具體的實(shí)現(xiàn)細(xì)節(jié)
具體結(jié)構(gòu)如下圖:
使用橋接模式實(shí)現(xiàn)的消息發(fā)送系統(tǒng)
using System;
// 1. 定義實(shí)現(xiàn)部分接口 - 消息發(fā)送方式
public interface IMessageSender
{
void SendMessage(string message);
}
// 2.1 具體實(shí)現(xiàn)類(lèi)1 - 電子郵件發(fā)送
public class EmailSender : IMessageSender
{
public void SendMessage(string message)
{
Console.WriteLine($"通過(guò)電子郵件發(fā)送: {message}");
}
}
// 2.2 具體實(shí)現(xiàn)類(lèi)2 - SMS發(fā)送
public class SmsSender : IMessageSender
{
public void SendMessage(string message)
{
Console.WriteLine($"通過(guò)SMS發(fā)送: {message}");
}
}
// 3. 定義抽象類(lèi) - 消息
public abstract class Message
{
protected IMessageSender messageSender;
// 在構(gòu)造函數(shù)中引用實(shí)現(xiàn)接口
public Message(IMessageSender messageSender)
{
this.messageSender = messageSender;
}
// 提供客戶端操作方法
public abstract void Send();
}
// 4.1 具體的抽象類(lèi)繼承 - 普通消息
public class NormalMessage : Message
{
private string content;
public NormalMessage(string content, IMessageSender messageSender)
: base(messageSender)
{
this.content = content;
}
public override void Send()
{
messageSender.SendMessage($"普通消息: {content}");
}
}
// 4.1 具體的抽象類(lèi)繼承 - 緊急消息
public class UrgentMessage : Message
{
private string content;
public UrgentMessage(string content, IMessageSender messageSender)
: base(messageSender)
{
this.content = content;
}
public override void Send()
{
messageSender.SendMessage($"緊急! {content}");
}
}
// 5. 客戶端使用
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建不同的消息發(fā)送方式
IMessageSender emailSender = new EmailSender();
IMessageSender smsSender = new SmsSender();
// 創(chuàng)建普通消息并通過(guò)電子郵件發(fā)送
Message normalEmailMessage = new NormalMessage("這是一個(gè)測(cè)試消息", emailSender);
normalEmailMessage.Send();
// 創(chuàng)建緊急消息并通過(guò)SMS發(fā)送
Message urgentSmsMessage = new UrgentMessage("系統(tǒng)即將關(guān)閉", smsSender);
urgentSmsMessage.Send();
// 創(chuàng)建緊急消息并通過(guò)電子郵件發(fā)送
Message urgentEmailMessage = new UrgentMessage("請(qǐng)立即回復(fù)", emailSender);
urgentEmailMessage.Send();
}
}
總結(jié)
橋接模式在以下情況下特別有用:
- 當(dāng)有多個(gè)變化維度,使用繼承會(huì)導(dǎo)致類(lèi)爆炸時(shí)
- 當(dāng)你想要避免抽象和它的實(shí)現(xiàn)之間的永久綁定時(shí)
- 當(dāng)你需要開(kāi)發(fā)一個(gè)可以在不同平臺(tái)上運(yùn)行的應(yīng)用程序時(shí),橋接模式可以隔離平臺(tái)特定的部分和業(yè)務(wù)邏輯部分
該文章在 2025/5/21 9:34:08 編輯過(guò)