依賴反轉原則(Dependency Inversion Principle, DIP) 以PHP為例

當我們談論依賴反轉原則(Dependency Inversion Principle,DIP)時,我們講的是高階模組(High-level Modules)不應該依賴於低階模組(Low-level Modules),兩者都應該依賴於抽象(Abstractions)。

下面是一個簡單的例子,展示如何使用 PHP 實現依賴反轉原則:

interface MessageSenderInterface {

    public function sendMessage($message);

}

class EmailSender implements MessageSenderInterface {

    public function sendMessage($message) {

        // 實現發送電子郵件的邏輯

        echo "Sending email: " . $message . "\n";

    }

}

class SMSsender implements MessageSenderInterface {

    public function sendMessage($message) {

        // 實現發送短信的邏輯

        echo "Sending SMS: " . $message . "\n";

    }

}

class NotificationService {

    private $messageSender;


    public function __construct(MessageSenderInterface $messageSender) {

        $this->messageSender = $messageSender;

    }

    public function sendNotification($message) {

        $this->messageSender->sendMessage($message);

    }

}


在這個例子中,我們定義了一個抽象的 MessageSenderInterface 介面,它包含一個 sendMessage 方法。然後,我們有兩個具體的類別 EmailSender 和 SMSsender,它們實現了 MessageSenderInterface 介面並分別實現了發送電子郵件和短信的邏輯。


接著,我們有一個 NotificationService 類別,它依賴於 MessageSenderInterface 介面,而不是具體的實現類別。這樣,我們可以在運行時傳遞不同的 MessageSenderInterface 實例,以改變消息的發送方式。


下面是使用上述程式碼的範例:

$emailSender = new EmailSender();

$notificationService = new NotificationService($emailSender);

$notificationService->sendNotification("Hello, Email!");


$smsSender = new SMSsender();

$notificationService = new NotificationService($smsSender);

$notificationService->sendNotification("Hello, SMS!");


在這個範例中,我們創建了 EmailSender 和 SMSsender 的實例,並將它們分別傳遞給 NotificationService。這樣,我們可以根據需要使用不同的消息發送方式。


這種實現方式遵循了依賴反轉原則,高階模組 NotificationService 依賴於抽象 MessageSenderInterface,而不是具體的低階模組 EmailSender 或 SMSsender。這使得程式碼更具彈性、可擴展性和可維護性,並且更容易進行單元測試和模組替換。

留言

這個網誌中的熱門文章

bcb C++ Builder無法讀取JPG

tesseract is not installed or it's not in your path

tensorflow gpu版本 安裝教學 window 10 python 3.6