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

C# 設計模式:模板方法模式完整指南(四)— 方法分類與重構原則

     編輯:關於C語言

模板方法中的兩大方法類別

模板方法

  • 定義於抽象類別
  • 將基本操作組合成完整演算法/行為
  • 通常在抽象類別中實作,子類別**不修改直接繼承**

基本方法

分三種:

類型宣告實作子類別行為C# 標記
抽象方法抽象類別無**必須**實作abstract
具體方法抽象類別抽象類別不實作/不覆寫無 abstract
鉤子方法抽象類別抽象類別(通常空實作)可選擇擴展慣用 Do 前綴

重構原則(Auer 1995)

  1. 根據行為而非狀態定義類別:實作建立在行為基礎上
  2. 使用抽象狀態而非具體狀態:涉及狀態時用取值方法間接引用,不直接存取屬性
  3. 給操作劃分層次:核心方法放入小組核心方法,方便子類別替換
  4. 將狀態屬性確認推遲到子類別:抽象類別避免過早宣告屬性,改用抽象取值方法

遵循原則的效果

  • 介面與實作分離
  • 抽象與具體分割
  • 代碼最大程度復用
  • 自然引導至模板方法模式

鉤子方法實務範例


abstract class ReportGenerator
{
    // 模板方法
    public void Generate()
    {
        FetchData();
        if (NeedHeader()) RenderHeader();  // 鉤子方法控制流程
        RenderBody();
        if (NeedFooter()) RenderFooter();  // 鉤子方法控制流程
    }

    protected abstract void FetchData();
    protected abstract void RenderBody();

    // 鉤子方法:預設空實作,子類別可選擇覆寫
    protected virtual bool NeedHeader() => true;
    protected virtual void RenderHeader() { }
    protected virtual bool NeedFooter() => false;
    protected virtual void RenderFooter() { }
}

class SimpleReport : ReportGenerator
{
    protected override void FetchData() { /* ... */ }
    protected override void RenderBody() { /* ... */ }
    // 不覆寫鉤子方法,使用預設行為
}

class DetailedReport : ReportGenerator
{
    protected override void FetchData() { /* ... */ }
    protected override void RenderBody() { /* ... */ }
    protected override bool NeedFooter() => true;  // 覆寫鉤子方法
    protected override void RenderFooter() { /* 詳細頁尾 */ }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved