Использование абстрактного класса для удовлетворения интерфейса в переполнении стека

Я хочу использовать Amazon SNS для отправки текстовых сообщений в моем приложении. Меня беспокоит только одно: что произойдет, если я решу поменять Amazon SNS на другого провайдера?

Я пришел к следующему решению, но не уверен, является ли это наилучшей практикой или имеет ли это какие-либо последствия в будущем.

<?php

interface SMS {
public function sendSMS($from, $to);
}

abstract class AmazonSNS {
public function sendSMS($from, $to) {
echo 'Message sent';
}
}

class Notification extends AmazonSNS implements SMS {

}

$notification = new Notification;
$notification->sendSMS('xxxx', 'xxxx');

Мой мыслительный процесс состоял в том, что мое приложение будет заботиться только о класс уведомлений и этот класс заставит все абстрактный класс (поставщик услуг) Я использую для реализации методов, требуемых интерфейсы (Я мог бы также использовать интерфейс электронной почты). Использование абстрактного класса также препятствует его непосредственному созданию, что было бы нежелательным поведением.

1

Решение

Для меня лучше использовать

<?php

interface Notification {
public function notify($from, $to);
}

class AmazonSNSSmsNotification implements Notification {
public function notify($from, $to) {
//send notification using SMS
}
}

class OtherProviderSmsNotification implements Notification {
public function notify($from, $to) {
//send notification using SMS from other provider
}
}

class EmailNotification implements Notification {
public function notify($from, $to) {
//send notification using email
}
}

тогда вы можете легко поменять реализацию

function sendNotification(Notification $notifObj, $from, $to) {
$notifObj.notify($from, $to);
}

sendNotification(new AmazonSNSSmsNotification(), $from, $to);
sendNotification(new OtherProviderSmsNotification(), $from, $to);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector