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

C# 設計模式:橋接模式完整指南(五)— 業務物件與數據物件解耦實戰與適用場景總結

     編輯:關於C語言

實戰:BusinessObject 與 DataObject 解耦

業務物件透過橋接模式與數據物件解耦,數據實現可動態更換**無需修改客戶端代碼**。

完整代碼實作


using System;
using System.Collections;

// 抽象化角色
class BusinessObject
{
    private DataObject dataObject;
    protected string group;

    public BusinessObject(string group) => this.group = group;

    public DataObject DataObject
    {
        set => dataObject = value;
        get => dataObject;
    }

    public virtual void Next() => dataObject.NextRecord();
    public virtual void Prior() => dataObject.PriorRecord();
    public virtual void New(string name) => dataObject.NewRecord(name);
    public virtual void Delete(string name) => dataObject.DeleteRecord(name);
    public virtual void Show() => dataObject.ShowRecord();

    public virtual void ShowAll()
    {
        Console.WriteLine($"Customer Group: {group}");
        dataObject.ShowAllRecords();
    }
}

// 修正抽象化
class CustomersBusinessObject : BusinessObject
{
    public CustomersBusinessObject(string group) : base(group) { }

    public override void ShowAll()
    {
        Console.WriteLine();
        Console.WriteLine("------------------------");
        base.ShowAll();
        Console.WriteLine("------------------------");
    }
}

// 實現化介面
abstract class DataObject
{
    public abstract void NextRecord();
    public abstract void PriorRecord();
    public abstract void NewRecord(string name);
    public abstract void DeleteRecord(string name);
    public abstract void ShowRecord();
    public abstract void ShowAllRecords();
}

// 具體實現化:記憶體清單
class CustomersDataObject : DataObject
{
    private ArrayList customers = new ArrayList();
    private int current = 0;

    public CustomersDataObject()
    {
        customers.Add("Jim Jones");
        customers.Add("Samual Jackson");
        customers.Add("Allen Good");
        customers.Add("Ann Stills");
        customers.Add("Lisa Giolani");
    }

    public override void NextRecord() => current = Math.Min(current + 1, customers.Count - 1);
    public override void PriorRecord() => current = Math.Max(current - 1, 0);
    public override void NewRecord(string name) => customers.Add(name);
    public override void DeleteRecord(string name) => customers.Remove(name);
    public override void ShowRecord() => Console.WriteLine(customers[current]);
    public override void ShowAllRecords()
        => customers.ForEach(c => Console.WriteLine(" " + c));
}

// 客戶端測試
public class BusinessApp
{
    public static void Main()
    {
        CustomersBusinessObject customers = new CustomersBusinessObject("Chicago");
        customers.DataObject = new CustomersDataObject(); // 動態注入實現

        customers.Show();
        customers.Next(); customers.Show();
        customers.Next(); customers.Show();
        customers.New("Henry Velasquez");
        customers.ShowAll();
    }
}

執行流程

Customer Group: Chicago
Jim Jones
Samual Jackson
Allen Good
Ann Stills
Lisa Giolani

------------------------
Customer Group: Chicago
Jim Jones
Samual Jackson
Allen Good
Ann Stills
Lisa Giolani
Henry Velasquez
------------------------

何時應用橋接模式

場景橋接模式價值
抽象化與實現化需獨立變化避免靜態繼承綁定,改用動態組合
實現化變更不應影響客戶端實現完全透明,客戶端零修改
多抽象化 × 多實現化需動態搭配運行時任意組合,避免笛卡兒積類別爆炸
需獨立管理兩個維度繼承無法獨立演進,組合可獨立擴展

核心洞見

橋接模式將「繼承關係」轉為「組合關係」,是**合成復用原則 (CARP)** 的經典應用。理解橋接 = 理解 OCP + CARP = 形成正確設計思想的關鍵里程碑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved