Wzorce obiektowe - poszukuję trzy proste przykłady

0

Witam.

W php jestem jeszcze zielony, aczkolwiek w tym semestrze mam 2 projekty i wiem że w ramach jednego projektu moge zaliczyć oba.
W związku z tym poprosiłbym o jakieś 3 proste i pasujące przykłady wzorców obiektowych do PHP.
Mój projekt to taka wyszukiwarka serwerów do starych gier (baza składa się z użytkowników, serwerów, gier, firm za nie odpowiadających i grup użytkowników).

1

Singleton - umożliwiający połączenie z jedną instancją bazy danych
Fabryka - przy tworzeniu nowych użytkowników/lub innych obiektów
Dekorator - który wzbogaci jakąś Twoją klasę o nowe ficzery :)

0

Zachęcam do przejrzenia wszystkich: Wzorce projektowe PHP

Idąc po najniższej linii oporu:

a) Value Object

class Email
{
    private $email;

    public function __construct($email)
    {
        if (strpos($email, '@') === false) {
            throw new InvalidArgumentException('This does not look like an email');
        }

        $this->email = $email;
    }
    public function __toString()
    {
        return $this->email;
    }
}

b) Adapter

abstract class Logger
{
    private $formatter;

    public function getFormatter()
    {
        if($this->formatter === null) {
           $this->formatter = new NullFormatter(); // NullObject Pattern, patrz niżej
        }

        return $this->formatter;
    }

    public function setFormatter(FormatterInterface $formatter)
    {
        $this->formatter = $formatter;
    }

    public function log($level, $message) {
        $log = $this->getFormatter()->format($message, $level, time());

        $this->logInternal($log);
    }

    protected abstract function logInternal($message);
}

final class FileAdapter extends Logger
{
    private $filename;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    protected function logInternal($message)
    {
        file_put_contents($this->filename, $message);
    }
}

// final class SyslogAdapter extends Logger {} 
// final class StreamAdapter extends Logger {} 
// final class SentryAdapter extends Logger {} 
// itd..

c) Null Object

interface FormatterInterface {
    public function format($message, $type, $timestamp);
}

final class NullFormatter implements FormatterInterface {

    public function format($message, $type, $timestamp)
    {
        return $message;
    }
}

final class FileFormatter implements FormatterInterface {

    private $format = "[%s][%s] %s";

    public function format($message, $type, $timestamp)
    {
        return sprintf($this->format, date('Y-m-d H:i:s', $timestamp), $type, $message) . PHP_EOL;
    }
}

Teraz gdziekolwiek w aplikacji, gdzie masz emaila:

$logger = new FileAdapter('test');
$logger->setFormatter(new FileFormatter());

$emailStr = "niepoprawny email";

try {
    $email = new Email($emailStr);
} catch (Exception $e) {
    $logger->log('ERROR', $e->getMessage() . ": " . $emailStr);
}

Nawiasem mówiąc dochodzi jeszcze wzorzec strategia (wydaje mi się, że można to pod to podciągnąć), a tymi strategiami są formatery.

0

Tak jak napisał @Desu dobrze przejrzeć wszystkie wzorce (lub przynajmniej te najpopularniejsze). Wzorce powinno się stosować, gdy zauważymy, że problem jaki mamy do rozwiązania pasuje do któregoś z nich - raczej nie na zasadzie "mam trzy i muszę je gdzieś wcisnąć".

Mogę jednak powiedzieć, dla których wzorców jest największa szansa, że będą dla Ciebie przydatne i powinny być łatwe w implementacji:

  • Metoda szablonowa - wszędzie tam, gdzie trzeba wykonać jakieś akcje, które różnią się w szczegółach w zależności od czegoś
  • Adapter (w wersji obiektowej) - wszędzie tam, gdzie pracujesz na obiektach o niespójnym interfejsie
  • Metoda wytwórcza - często przydaje się do tworzenia obiektów
  • Fasada - prawdopodobnie w postaci jakiegoś FrontControllera, jeżeli nie korzystasz z frameworków

[Adam]

1 użytkowników online, w tym zalogowanych: 0, gości: 1