Autor | Zpráva | ||
---|---|---|---|
DesPatt Profil * |
#1 · Zasláno: 28. 2. 2014, 18:41:35
Dobrý den, potřeboval bych radu s objektovým poskládáním aplikace. Mám třídy jako je User, Student, Teacher. Tyto třídy v podstatě dělají to stejné (zápis do db, modifikace dat, výpis...) ale každá to dělá trochu jinak, nad jinou tabulkou. zkusil jsem tedy použít návrhový vzor Adapter. Pro každou z těchto třídy jsem vytvořil třídu UserMySQLAdapter, StudentMySQLAdapter...
Problém je pokud Student nebo Učitel potřebují provádět nějakou akci která už není pro všechny společná (není v rozhraní) pak jí nemůžu zavolat. Mám to zhruba nějak takto: interface IDatabaseAdapter { function Insert(object item); function Select(id); function SelectAll(); function Delete(object item); } class StudentMySQLAdapter extends IDatabaseAdapter { public function Insert(Student $student) { //MYSQL } public function Select($id) { //MYSQL } public function SelectAll() { //MYSQL } public function Delete(Student $item) { //MYSQL } } abstract class DbItem { //IDatabaseAdapter protected $adapter; public function __construct(IDatabaseAdapter $adapter) { $this->adapter = $adapter; } public abstract function Save(); public abstract function Read(); public abstract function ReadAll(); public abstract function Remove(); } class Student extends DbItem { public function __construct($name, $address...) { parent::__construct(new StudentMySQLAdapter()); } public function Save() { $this->adapter->Insert($this); } public function Read() { $this->adapter->Select($this->id); } public function ReadAll() { } public function Remove() { } //Zjistí jaké má student známky //Vrací pole předmětů a známek. public function MyResults() { //Nelze volat přes adaptér, protože příslušná metoda není v rozhraní. Kdyby tam byla, mohl by podobnou metodu implementovat i třeba učitel... } } Děkuji za pomoc |
||
Bertram Profil |
#2 · Zasláno: 1. 3. 2014, 10:30:34
Myslím si, že jste se do toho moc zamotal a adaptér by měl zůstat pouze prostředníkem dvou rozhraní, kdy rozhraní vaší aplikace zůstává neměnné a pouze měníte adaptér v závislosti na použítí komponenty se kterou vaše aplikace komunikuje pomocí adaptéru.
Na ř.9 by mělo být implements místo extends , rozhraní se nedědí.
Také si myslím že student není potomkem databázové položky, ale mohl by existovat objekt, který by měl na starost správu studentů a ten by řekl adaptéru ať např. studenta Karáska vymaže z databáze. |
||
juriad Profil |
#3 · Zasláno: 1. 3. 2014, 10:33:32
DesPatt:
Zkus si pročíst a pochopit http://www.oracle.com/technetwork/java/dataaccessobject-138824.html. Je to přesně to co chceš akorát v Javě, princip je však shodný. |
||
Časová prodleva: 10 let
|
0