我有一個Laravel應用程序,我正在創建一個導入數據的類。數據存儲在大約15個不同的模型中,所以我有一個類來處理每個模型,因爲每個模型都有自己的實現。此外,未來可能會增加更多型號。設計一個類,要求幾個類執行相同的任務
我想在Importer
類中有一行代碼,如$importer->import()
,然後這個類將接收所有15個實現類,並調用它們的import()
方法。
然而,通用$importer->import()
方法則是這樣的:
public function __construct(ImporterOne $one, ImporterTwo $two, ImporterThree $three, etc..)
{
$this->importerOne = $importerOne;
$this->importerTwo = $importerTwo;
// etc ...
$this->importerFifteen = $importerFifteen;
}
public function import()
{
$this->importerOne->import();
$this->importerTwo->importer();
// etc...
}
這似乎不是非常好,因爲這個類屆時將有超過15度的關係本質上都做同樣的事情。然後爲了更新這個,我需要在這裏進行添加/刪除依賴關係和import()
方法調用。
因此,我的解決方案是將導入器的「註冊」委派給每個實現,而不是讓通用導入器類負責。有效地,一個觀察員的種類。但不是客戶將觀察者附加到主題,而是每個實現都附加到主題上。
use Importer as GenericImporter
public class importerOne {
public function __construct(SomeModel $model, GenericImporter $importer)
{
$this->importer = $importer;
$this->importer->attach($this);
}
}
// Do the same for each implementation
// and then the generic importer
public class Importer {
protected $importables = [];
public function attach($import_implementation)
{
array_push($importables, $import_implementation);
}
public function import()
{
foreach($this->importables as $importable)
{
$importable->import();
}
}
}
這看起來很不錯並且固體。但是,問題是每個實現現在都使用GenericImporter的OWN實例。那麼最好的方法是什麼呢?我是否將Single Generic Importer作爲Singleton實施?此外,爲了我的研究目的,這是否屬於某種設計模式?除了每個觀察者正在註冊之外,它看起來與ObservorPattern類似。
感謝您的回答。但是,在Laravel中,通過IoC容器解析依賴關係時,不會通過引用傳遞。它正在實例化該類的一個新實例(在這種情況下爲導入器)。在客戶端代碼中設置它是有道理的,但基本上,我試圖避免這樣的情況:如果需求發生變化並且有更多的實現,我不會不斷修改方法/類/客戶端代碼來追加/刪除實現 – djt
@dtj:第一件事檢查我的編輯上面。對於第二種情況:如果您的客戶端中有多個點需要將不可推薦的數據附加到導入器,則最好使用觀察者的方式 – Moppo
感謝關於該實例的提示,我不知道這一點。我想這是最後一個方面:基本上,所有這些實現都依賴通用導入器類來執行它們的功能。到目前爲止,我仍然需要在代碼中的某個地方實例化每個實現,以觸發Generic Importer的依賴注入到每個實現中。我希望基本上定義所有的實現(可能在服務提供者中),並且當我從某處調用$ importer-> import()時,應用程序知道要收集這些實現並實例化它們。 – djt