首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:橋接模式完整指南(三)— 調製解調器問題與設計演進分析

     編輯:關於C語言

調製解調器問題背景

參考《敏捷軟件開發》與《Java與模式》經典案例。

初始設計:單一介面

  • Modem 介面:Dial()、Hangup()、Send()、Recv()
  • 實作:HayesModem、USRoboticsModem、ErnieModem
  • 客戶程式面向 Modem 介面程式設計
  • 符合 OCP、LSP、DIP,新增調製解調器不影響客戶端

新需求:專用線調製解調器

  • 不需撥號,僅通訊
  • 新應用 DedUser 僅使用通訊功能
  • 客戶要求:**現有所有客戶程式**皆可使用專用線調製解調器
  • 不允許修改現有大量客戶程式

理想設計(但需修改客戶端)

  • 拆分為 Modem(通訊)+ Dialer(撥號)兩介面
  • 傳統調製解調器實作兩介面
  • DedicatedModem 僅實作 Modem
  • DedUser 僅依賴 Modem
  • **問題**:需修改所有現有客戶程式引入 Dialer

妥協方案:空實作繼承

  • DedicatedModem 繼承 Modem
  • Dial()/Hangup() 實作為空方法
  • **缺點**:違反介面隔離原則,語意不清,測試困難

橋接模式正確解法

將「撥號」與「通訊」分離為兩個**實現化維度**,抽象化維度為「調製解調器類型」,實現化維度為「連線方式」。


// 抽象化:調製解調器核心功能
abstract class Modem
{
    protected IConnection connection; // 實現化引用
    public Modem(IConnection conn) => connection = conn;
    public void Send(byte[] data) => connection.Send(data);
    public byte[] Recv() => connection.Recv();
}

// 修正抽象化
class HayesModem : Modem { public HayesModem(IConnection c) : base(c) { } }
class DedicatedModem : Modem { public DedicatedModem(IConnection c) : base(c) { } }

// 實現化介面
interface IConnection
{
    void Dial(string number);
    void Hangup();
    void Send(byte[] data);
    byte[] Recv();
}

// 具體實現化
class PhoneConnection : IConnection { /* 撥號+通訊 */ }
class LeasedLineConnection : IConnection { /* 僅通訊,Dial/Hangup 空實作 */ }

橋接優勢

  • 現有客戶程式**零修改**繼續使用 Modem 抽象
  • 新增連線方式(衛星、光纖)只需新增 IConnection 實作
  • 新增調製解調器品牌只需新增 Modem 子類
  • 兩個維度**獨立演進**,任意組合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved