Ahoj,
mám dvě třídy, které mohou ukládat soubory (obrázky) do databáze a také na pevný disk do nějaké složky. Chci tyto třídy použít zároveň a ukládat jak do databáze, tak na pevný disk - třeba jako zálohu, to je už jedno. Přikládám hirearchii objektů:
interface Storage {
public function store();
}
class DatabaseStorage implements Storage {
public function store() {
//...
}
}
class FileStorage implements Storage {
public function store() {
//...
}
}
Tak, a teď chci tyto dvě třídy použít zároveň, takže jsem si vytvořil novou třídu.
class ChainStorage implements Storage {
private $databsaeStorage;
private $fileStorage;
public function __construct(Storage $databaseStorage, Storage $fileStorage) {
$this->databaseStorage = $databaseStorage;
$this->fileStorage = $fileStorage;
}
public function store() {
$this->databaseStorage->store();
$this->fileStorage->store();
}
}
Nicméně, tento způsob se mi nelíbí. Omezuje mě v tom, že pokud bych chtěl přidat další "Storage", musel bych přidat parametr a to mě znechucuje.
Taktéž nechci použít žádný setter typu "setStorage" nebo jinou metodu typu "addStorage", protože by se mi "znehodnotilo" rozhraní.
V jiných programovacích jazycích bych si jednoduše vytvořit List<Storage> nebo něco v tom smyslu a to předal konstruktoru a poté to v dané metodě store projel cyklem a byl by pokoj, ale jak to udělat tady?
Dostal se někdo do stejné situace, popřípadě, jak jí řešil, či jak byste ji řešili vy?