天天看點

【愚公系列】2021年12月 通用職責配置設定原則(六)-多态原則(Polymorphism Principle)

文章目錄

前言

一、多态原則(Polymorphism Principle)

二、使用步驟

示例

GRASP:General Responsibility Assignment Software Patterns 通用職責配置設定軟體模式。

首先我們先來區分下GRASP與GOF模式的差別,它們主要在什麼時候用,用來做什麼。在軟體開發過程中,我們常說面向對象開發,面向對象思想應該貫穿整個軟體開發生命周期。我們在将現實世界中的業務對象及業務功能抽象成軟體系統中的系統對象過程中應該遵循使用GRASP模式。而在具體技術實作上應該遵循使用GOF設計模式,來實作系統功能。即GRASP主要使用在分析設計階段,與具體技術無關;而GOF模式主要使用在開發階段,與具體技術相關,它是對GRASP設計成果進行實作時而使用,是一種開發階段的設計模式。

GRASP軟體設計模式包括9個模式:建立者、資訊專家、低耦合、控制器、高内聚、多态性、純虛構、間接性、防止變異。

提示:以下是本篇文章正文内容,下面案例可供參考

(1)問題

1、如何處理基于類型的不同選擇?

2、如何建立可嵌入的軟體元件?

(2)方案

當相關選擇或行為随類型(類)變化而變化時,用多态操作為行為變化的類型配置設定職責。

(3)分析

由條件變化引發同一類型的不同行為是程式的一個基本主題。如果用if-else或switch-case等條件語句來設計程式,當系統發生變化時必須修改程式的業務邏輯,這将導緻很難友善地擴充有新變化的程式。另外對于伺服器/用戶端結構中的可視化元件,有時候需要在不影響用戶端的前提下,将伺服器的一個元件替換成另一個元件。此時可以使用多态來實作,将不同的行為指定給不同的子類,多态是設計系統如何處理相似變化的基本方法,基于多态配置設定職責的設計可以友善地處理新的變化。在使用多态模式進行設計時,如果需要對父類的行為進行修改,可以通過其子類來實作,不同子類可以提供不同的實作方式,将具體的職責配置設定給指定的子類。新的子類增加到系統中也不會對其他類有任何影響,多态是面向對象的三大基本特性之一(另外兩個分别是封裝和繼承),通過引入多态,子類對象可以覆寫父類對象的行為,更好地适應變化,使變化點能夠“經得起未來驗證”。多态模式在多個GoF設計模式中都有所展現,如擴充卡模式、指令模式、組合模式、觀察者模式、政策模式等。

public class Folder : FileSystem {

    private List<FileSystem> _childrens = null;

    public Folder(string name) : base(name) {
        _childrens = new List<FileSystem>();
    }

    public override FileSystem Attach(FileSystem component) {
        _childrens.Add(component);
        return this;
    }

    public override FileSystem Detach(FileSystem component) {
        _childrens.Remove(component);
        return this;
    }

    public override void Print(int depth = 0) {
        Console.WriteLine(new string(SPLIT_CHAR_DIR, depth) + _name);
        foreach (var component in _childrens) {
            component.Print(depth + 1);
        }
    }

}      

以上代碼可在我的 C#設計模式 系列博文中結構型模式下的組合模式中找到。

繼續閱讀