It seems like these interfaces are pretty much useless for any real world problem. Can someone enlighten me?
Интерфейс
В то время как абстрактные классы позволяют вам обеспечить некоторую меру реализации, интерфейсы — это чистые шаблоны. interface
может только define functionality
; он никогда не сможет реализовать это. Интерфейс объявляется с помощью ключевого слова interface. Он может содержать объявления свойств и методов, но не тела методов.
Пример использования интерфейса
Например, если вы хотите, чтобы ваш проект поддерживал разные базы данных. чтобы вы могли изменить свою базу данных в будущем, лучше использовать интерфейсы, которые содержат процедуры свойств в файле класса без изменения объектов.
By itself, interfaces are not very useful
потому что вы не можете создавать экземпляры интерфейсов, но интерфейсы играют важную роль в реализации методологий объектно-ориентированного проектирования which in real sense makes your live easier as a programmer
потому что главным стимулом для объектно-ориентированного программирования является инкапсуляция (Вас не волнует, как реализована возможность. Вы, как программист, доступны только интерфейсу. Это также хороший способ следить за архитектурой системы)
SplSubject и SplObserver
Ортогональность — это добродетель. Одной из целей программистов должно быть создание компонентов, которые можно изменять или перемещать с минимальным воздействием на другие компоненты.
Если каждое изменение, которое вы вносите в один компонент, влечет за собой череду изменений в другом месте кодовой базы, задача разработки может быстро превратиться в спираль создания и устранения ошибок.
В SplSubject и SplObserver, потому что они оба interface to implement the Observer Design Pattern.
Шаблон Observer
Шаблон наблюдателя — это шаблон проектирования программного обеспечения, в котором объект, называемый субъектом, ведет список своих зависимых объектов, называемых наблюдателями, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов. Он в основном используется для реализации распределенных систем обработки событий.
- Шаблон Observer определяет зависимость «один ко многим» между объектом-субъектом и любым количеством объектов-наблюдателей, так что при изменении состояния объекта-субъекта все его объекты-наблюдатели уведомляются и обновляются автоматически.
- Паттерн Observer по существу позволяет неограниченному количеству объектов наблюдать или прослушивать события в наблюдаемом объекте (или субъекте), регистрируя себя. После того, как наблюдатели зарегистрированы на событие, субъект уведомит их, когда событие будет запущено.
- Субъект обрабатывает это, сохраняя коллекцию наблюдателей и перебирая ее, когда происходит событие, чтобы уведомить каждого наблюдателя.
- Шаблон наблюдателя регистрирует наблюдателей с субъектом.
- У вас может быть несколько наблюдателей. Субъект должен вести список зарегистрированных наблюдателей, и когда происходит событие, он запускает (уведомляет) всех зарегистрированных наблюдателей.
- Отменить регистрацию также возможно, когда нам не нужен ни один наблюдатель.
Пример 1. Система уведомления о процентной ставке по кредиту
$loan = new Loan("Mortage", "Citi Bank", 20.5);
$loan->attach(new Online());
$loan->attach(new SMS());
$loan->attach(new Email());
echo "<pre>";
$loan->setIntrest(17.5);
Вывод
Online : Post online about modified Intrest rate of : 17.50
Send SMS : Send SMS to premium subscribers : 17.50
Send Email: Notify mailing list : 17.50
Пример 2. Простой монитор регистрации пользователей
$users = new Users();
new Audit($users);
new Logger($users);
new Security($users);
$users->addUser("John");
$users->addUser("Smith");
$users->addUser("Admin");
Вывод
Audit : Notify Audit about John
Log : User John Create at Wed, 12 Dec 12 12:36:46 +0100
Audit : Notify Audit about Smith
Log : User Smith Create at Wed, 12 Dec 12 12:36:46 +0100
Audit : Notify Audit about Admin
Log : User Admin Create at Wed, 12 Dec 12 12:36:46 +0100
Security : Alert trying to create Admin
Преимущество шаблона проектирования Observer. Основное преимущество заключается в слабой связи между объектами, называемыми наблюдателем и наблюдаемым. Субъект знает только список наблюдателей, его не волнует, как они реализуют свою реализацию. Все наблюдатели уведомляются субъектом в одном вызове события в виде широковещательной связи.
Недостаток шаблона проектирования Observer:
- Недостатком является то, что иногда, если возникает какая-либо проблема, отладка становится очень сложной, потому что поток управления неявно между наблюдателями и наблюдаемым, мы можем предсказать, что теперь наблюдатель сработает, и если между наблюдателями есть цепочка, отладка становится более сложной.
- Другая проблема — управление памятью при работе с большими наблюдателями.
Общие классы
abstract class Observable implements SplSubject {
protected $_observers = [];
public function attach(SplObserver $observer) {
$id = spl_object_hash($observer);
$this->_observers[$id] = $observer;
}
public function detach(SplObserver $observer) {
$id = spl_object_hash($observer);
if (isset($this->_observers[$id])) {
unset($this->_observers[$id]);
}
}
public function notify() {
foreach ( $this->_observers as $observer ) {
$observer->update($this);
}
}
}
abstract class Observer implements SplObserver {
private $observer;
function __construct(SplSubject $observer) {
$this->observer = $observer;
$this->observer->attach($this);
}
}
Загрузить примеры классов
class Loan extends Observable {
private $bank;
private $intrest;
private $name;
function __construct($name, $bank, $intrest) {
$this->name = $name;
$this->bank = $bank;
$this->intrest = $intrest;
}
function setIntrest($intrest) {
$this->intrest = $intrest;
$this->notify();
}
function getIntrest() {
return $this->intrest;
}
}
class Online implements SplObserver {
public function update(SplSubject $loan) {
printf("Online : Post online about modified Intrest rate of : %0.2f\n",$loan->getIntrest());
}
}
class SMS implements SplObserver {
public function update(SplSubject $loan) {
printf("Send SMS : Send SMS to premium subscribers : %0.2f\n",$loan->getIntrest());
}
}
class Email implements SplObserver {
public function update(SplSubject $loan) {
printf("Send Email: Notify mailing list : %0.2f\n",$loan->getIntrest());
}
}
Классы примеров регистрации пользователей
class Users extends Observable {
private $name;
function addUser($name) {
$this->name = $name;
$this->notify();
}
function getName() {
return $this->name;
}
}
class Audit extends Observer {
public function update(SplSubject $subject) {
printf("Audit : Notify Autify about %s\n", $subject->getName());
}
}
class Logger extends Observer {
public function update(SplSubject $subject) {
printf("Log : User %s Create at %s\n", $subject->getName(),date(DATE_RFC822));
}
}
class Security extends Observer {
public function update(SplSubject $subject) {
if($subject->getName() == "Admin")
{
printf("Security : Alert trying to create Admin\n");
}
}
}
person
Baba
schedule
12.12.2012
instanceof
, прежде чем он сможет безопасно это сделать. Однако обратите внимание, что следующее удовлетворяет сигнатуре методаupdate(SplSubject $subject, $event = null)
и очень помогает в ситуации. - person goat   schedule 12.12.2012isset($event)
(что не является большой проблемой, но как бы ни был прост шаблон Observer, я мог бы переписать эти интерфейсы в пару минут и избежать всех этих проблем). - person FtDRbwLXw6   schedule 12.12.2012public function update(SplSubject $subject, Event $event)
(без значения по умолчанию), тогда проверка на нуль не требовалась бы, но это, очевидно, невозможно из-за несоответствия подписи. Тем не менее, предоставление добавленному параметру значения по умолчанию решает эту проблему, что было моей первоначальной проблемой. Если вы сделаете это ответом, я приму его. - person FtDRbwLXw6   schedule 12.12.2012SplObserver
иSplSubject
(PHP 5.4) в надежде, что они были реализованы каким-то другим классом SPL. Похоже, изначально предполагалось использовать их сSplObjectStorage
, у которого есть как методы присоединения, так и отсоединения, но нет уведомлений. Однако оба этих интерфейса не используются и не содержат никакой функциональности. Хотя они могут помочь реализовать шаблон, намекая на методы, которые можно использовать, в остальном они практически бесполезны. - person Leigh   schedule 12.12.2012$this->event_name
в методе уведомления перед вызовомupdate
? - person Anthony   schedule 21.01.2015