用品

什麼是設計模式:為什麼要使用它們、分類、優點和缺點

在軟體工程中,設計模式是軟體設計中常見問題的最佳解決方案。

它們就像前期項目defi您可以自訂經過嘗試和測試的工具來解決程式碼中反覆出現的設計問題。

預計閱讀時間: 6 minuti

什麼是設計模式

設計模式不是我們可以複製並插入程式中的程式碼,就像我們可以使用標準函數或函式庫一樣。設計模式是能夠解決特定問題的一般概念。基本上是一個模型,我們可以遵循其詳細資訊並實施適合我們程序實際情況的解決方案。

模型經常與演算法混淆,因為這兩個概念都描述了一些已知問題的典型解決方案。雖然演算法 defi如果總是有一組明確的操作可以實現某個目標,那麼模型就是解決方案的更高層次的描述。應用於兩個不同程式的相同模型的程式碼可能會不同。

打個比方,我們可以想到烹飪食譜:兩者都有明確的步驟來實現目標。然而,模型更像是一個項目,你可以看到它的結果和特點,但具體的實現順序取決於我們編寫程式碼的人。

設計模式是由什麼組成的?

大多數模式都被非常正式地描述,以便人們可以在許多上下文中重現它們。讓我們看看下面模型描述中存在的元素:

  • 意圖 該模型簡要描述了問題和解決方案。
  • 動機 進一步解釋了問題以及模型所提供的解決方案。
  • 結構體 類別顯示了模型的每個部分以及它們之間的關係。
  • 程式碼範例 使用最受歡迎的程式語言之一可以更輕鬆地理解模型背後的想法。

為什麼要使用它們?

程式設計師可以在不知道設計模式存在的情況下開發軟體。許多人這樣做,因此他們在不知情的情況下實施了一些計劃。但那我們為什麼要花時間學習它們呢?

  • 設計模式是一套 久經考驗的解決方案 軟體設計的常見問題。即使您從未遇到過這些問題,了解模式仍然有用,因為它教導您如何使用物件導向的設計原則來解決各種問題。
  • 設計模型 defi他們創建了一種通用語言,您和您的團隊可以使用它來更有效地溝通。你可以說,“哦,只需使用單例來做到這一點”,每個人都會理解你的建議背後的想法。如果您知道模式及其名稱,則無需解釋單例是什麼。

設計模式的分類

設計模式在整個設計系統的複雜性、詳細程度和適用範圍方面有所不同。

以此類推,我們可以透過安裝幾個紅綠燈或建造一個帶有地下行人通道的整個多層立交橋來使十字路口更安全。

最基本的低階模型通常稱為 成語 。它們通常僅適用於單一程式語言。

最通用和最高級的模型是 建築模型 。開發人員幾乎可以用任何語言實作這些模式。與其他模式不同,它們可用於設計整個應用程式的架構。

此外,所有型號都可以根據其用途進行分類 試過了 或目的。三個主要類別是:

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。
  • 創意模型 它們提供了物件建立機制,可以提高現有程式碼的靈活性和重用性。
  • 結構模型 他們解釋瞭如何將物件和類別組裝成更大的結構,並使這些結構保持靈活和高效。
  • 行為模型 它們處理對象之間的有效溝通和責任分配。

Laravel 中的設計模式範例:Facade

正面 是一種結構設計模式,為函式庫、框架或任何其他複雜的類別集提供簡化的介面。

問題

假設我們需要使軟體能夠基於屬於複雜程式庫或框架的大量物件來運作。通常,我們需要初始化所有這些物件、追蹤依賴關係、以正確的順序執行方法等等。

結果,類別的業務邏輯將與第三方類別的實作細節緊密耦合,使得它們難以理解和管理。

facade 是一個為包含許多活動部件的複雜子系統提供簡單介面的類別。 A facade 與直接使用子系統相比,可能提供有限的功能。然而,它只包含客戶真正關心的功能。

有一個 facade 當我們需要將應用程式與具有數十種功能的複雜庫集成,但我們只需要其功能的一小部分時,它非常有用。

例如,將貓的有趣短影片上傳到社交媒體的應用程式可能會使用專業的影片轉換庫。然而,我們真正需要的是一個具有單一方法的類 encode(filename, format)。創建這樣一個類別並將其連接到視訊轉換庫後,我們將擁有第一個類 facade.

例如,呼叫中心的電話接線員就像 facade。事實上,當我們撥打商店的電話服務進行電話訂購時,接線員就是我們的 facade 面向商店的所有服務和部門。營運商為訂購系統、支付網關和各種送貨服務提供簡單的語音介面。

PHP 中的真實範例

想想 正面 作為一些複雜子系統的簡單適配器。 Facade 將複雜性隔離在單一類別中,並允許其他應用程式程式碼使用簡單的介面。

在這個例子中, Facade 對客戶端程式碼隱藏了 YouTube API 和 FFmpeg 程式庫的複雜性。客戶端在 Facade 上使用一個簡單的方法,而不是使用數十個類別。

<?php

namespace RefactoringGuru\Facade\RealWorld;

/**
 * The Facade provides a single method for downloading videos from YouTube. This
 * method hides all the complexity of the PHP network layer, YouTube API and the
 * video conversion library (FFmpeg).
 */
class YouTubeDownloader
{
    protected $youtube;
    protected $ffmpeg;

    /**
     * It is handy when the Facade can manage the lifecycle of the subsystem it
     * uses.
     */
    public function __construct(string $youtubeApiKey)
    {
        $this->youtube = new YouTube($youtubeApiKey);
        $this->ffmpeg = new FFMpeg();
    }

    /**
     * The Facade provides a simple method for downloading video and encoding it
     * to a target format (for the sake of simplicity, the real-world code is
     * commented-out).
     */
    public function downloadVideo(string $url): void
    {
        echo "Fetching video metadata from youtube...\n";
        // $title = $this->youtube->fetchVideo($url)->getTitle();
        echo "Saving video file to a temporary file...\n";
        // $this->youtube->saveAs($url, "video.mpg");

        echo "Processing source video...\n";
        // $video = $this->ffmpeg->open('video.mpg');
        echo "Normalizing and resizing the video to smaller dimensions...\n";
        // $video
        //     ->filters()
        //     ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
        //     ->synchronize();
        echo "Capturing preview image...\n";
        // $video
        //     ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
        //     ->save($title . 'frame.jpg');
        echo "Saving video in target formats...\n";
        // $video
        //     ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
        //     ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
        //     ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
        echo "Done!\n";
    }
}

/**
 * The YouTube API subsystem.
 */
class YouTube
{
    public function fetchVideo(): string { /* ... */ }

    public function saveAs(string $path): void { /* ... */ }

    // ...more methods and classes...
}

/**
 * The FFmpeg subsystem (a complex video/audio conversion library).
 */
class FFMpeg
{
    public static function create(): FFMpeg { /* ... */ }

    public function open(string $video): void { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}

class FFMpegVideo
{
    public function filters(): self { /* ... */ }

    public function resize(): self { /* ... */ }

    public function synchronize(): self { /* ... */ }

    public function frame(): self { /* ... */ }

    public function save(string $path): self { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}


/**
 * The client code does not depend on any subsystem's classes. Any changes
 * inside the subsystem's code won't affect the client code. You will only need
 * to update the Facade.
 */
function clientCode(YouTubeDownloader $facade)
{
    // ...

    $facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");

    // ...
}

$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);

Ercole Palmeri

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。

最近的文章

Veeam 為勒索軟體提供最全面的支持,從保護到回應和恢復

Veeam 的 Coveware 將繼續提供網路勒索事件回應服務。 Coveware 將提供取證和修復功能…

23月2024

綠色與數位革命:預測性維護如何改變石油和天然氣產業

預測性維護正在透過創新和主動的工廠管理方法徹底改變石油和天然氣行業。

22月2024

英國反壟斷監管機構對 GenAI 向 BigTech 發出警報

英國 CMA 對大型科技公司在人工智慧市場的行為發出了警告。那裡…

18月2024

Casa Green:義大利永續未來的能源革命

歐盟為提高建築物能源效率而製定的「綠色案例」法令已結束立法程序…

18月2024