2017-05-24 2 views
0

In meiner Controller-Klasse Ich will nur nur eine Kalkulationstabelle Klasse verwenden, um alle Funktionen in Tabellenkalkulationserstellung mit Bezug zu verarbeiten, speichern, zu laden, schreiben usw.Welches Entwurfsmuster wird verwendet, wenn verschiedene Bibliotheken ein Spreadsheet erstellen?

Derzeit ist ich mit einer Open-Source-Bibliothek phpspreadsheet eine Tabelle erstellen Wenn ich das später in eine andere Bibliothek der Tabellenkalkulation ändern möchte, möchte ich nicht viel an der Controller-Klasse ändern, stattdessen kann ich eine andere Klasse für diese Bibliothek erstellen, wie Spreadsheetlib2. Welches Designmuster sollte hier besser verwendet werden? "Brücke" oder Adapter?

// Bridge Muster, was ich jetzt versuche.

interface SpreadsheetInterface { 

    public function create(); 

    public function write(); 

} 


class Spreadsheet extends AbstractSpreadsheet { 

    public function create() { 

    } 
} 



class PhpSpreadsheet implements SpreadsheetInterface { 

    public function create() { 

    } 
} 


abstract class AbstractSpreadsheet { 

    protected $spreadsheet; 

    protected function __construct(SpreadsheetInterface $spreadsheet) { 
     $this->spreadsheet = $spreadsheet; 
    } 
} 

Antwort

1

Ich würde wirklich so viel Aufmerksamkeit auf "welches Muster zu verwenden" zahlen. Muster sind keine magischen Rezepte, um deinen Code zu schreiben. Sie sind nur "Kurzbeschreibungen", die Sie verwenden, um Dinge, die Sie bereits geschrieben haben, an andere Entwickler zu beschreiben.

Die Art, wie ich es tun würde, wäre ein Wrapper erstellen (ich glaube, das zählt als "Adapter"), die eine bestimmte Schnittstelle implementiert, die Sie Controller abhängig ist. Und in diesem Wrapper würde ich die PhpSpreadsheet-Instanz als eine Abhängigkeit übergeben (oder eine neue Instanz davon direkt in diesem Wrapper erstellen).

Wenn Ihr Controller eine Methode auf dem Wrapper aufruft, leitet er den Anruf an die zugrunde liegenden „Tabelle Klasse.

0

Heres einen kleiner Trick, die Lehre eine Connection Schnittstelle zu definieren, verwendet, während PDO zur gleichen Zeit erstrecken.

interface Connection 
{ 
    public function prepare ($statement, array $driver_options = array()); 
} 

class PdoConnection extends \PDO implements Connection 
{ 

} 

So wollten sie eine Schnittstelle definieren, dass sie auf die Anforderungen auf Basis implementieren könnte von was auch immer DB sie wurden zu verbinden. Aber sie wollten die API ziemlich ähnlich wie PDO halten, jedoch PDO nicht ein Gerät Schnittstelle, also mussten sie einen auf ihn durch Erweiterunghuckepackimplementiert Connection, daher PDO implementiert unwissentlich die Methoden von Connection.

Sie können das gleiche wirklich tun. Wählen Sie die Tabellenkalkulationsbibliothek, die Ihnen am besten gefällt, und erstellen Sie eine Schnittstelle anhand ihrer Methoden, erstellen Sie eine neue Klasse und erweitern Sie dann Ihre Schnittstelle.

Jetzt, wenn Sie die Implementierung wechseln möchten, sollte Ihre Lieblingsbibliothek Ihnen eine anständige Menge an Methodensignaturen zur Verfügung gestellt haben, um eine andere Version zu implementieren.

Verwandte Themen