2010-06-07 11 views
5

Ich brainstorming einige Ideen um ein Muster für das folgende Szenario zu verwenden.Entwurfsmuster, um allgemeine Funktionalität zwischen UI-Steuerelementen zu verkapseln

Ich habe einige Steuerelemente von Drittanbietern, denen ich allgemeine Funktionalität hinzufügen möchte. Funktionalität wird hinzugefügt, indem mehrere der Ereignisse behandelt werden und bestimmte Dinge ausgeführt werden, wenn die Ereignisse zusammen mit dem Hinzufügen einiger privater Variablen ausgelöst werden, um einige Statusinformationen zwischen Ereignissen zu speichern. Ich möchte den Code und die Funktionalität wiederverwenden, also würde ich das normalerweise tun.

Erstellen Sie eine Klasse für diese Funktionalität, und übergeben Sie die Instanz des Steuerelements, dem ich die Funktionalität im Konstruktor hinzufügen möchte.

Dann kann ich Event-Handler zum Steuerelement in der Instanz der Klasse hinzufügen.

Kann jemand an alternative Muster denken, um diese Art von wiederverwendbarer Funktionalität zu erstellen?

Antwort

0

Das am besten anwendbare "Design Pattern" ist Observer. Die wiederverwendbare Funktionalität, die Sie entwickeln möchten, kann als einfache Beobachter von Control implementiert werden, die eine Teilmenge von Control-Ereignissen abonnieren. Glücklicherweise implementieren Windows Forms-Steuerelemente viele Ereignisse, wodurch es möglich ist, Funktionen von außerhalb der Klasse fast so einfach hinzuzufügen wie von innen, durch die übliche Unterklassierung.

Zum Beispiel können Sie Drag & Drop-Unterstützung hinzufügen, indem Sie einen Observer implementieren, der DragOver und DragDrop (und möglicherweise DragLeave) abonniert und die entsprechenden Aktionen basierend auf den DragDropEvent-Daten ausgeführt hat.

Dies ist eine hervorragende Technik, die Sie berücksichtigen sollten, da Sie diese Funktionalität einmal entwickeln und vielen Controls hinzufügen können.

+0

Wenn Sie zu den Fleisch und Knochen von dem, was ich schon mache, kommen, ist es alles Beobachter hinter den Kulissen. Es würde keinen Sinn machen, es weiter auszubauen und Observer-Interfaces zu erstellen und einer strengen Musterrichtlinie zu folgen. Im Grunde erstelle ich eine Klasse, in der ich das Steuerelement im Konstruktor übergebe und dann Ereignisse delegiere, um die Steuerungsereignisse zu behandeln. Das Ereignismodell in .NET wird bereits als Observer-Muster betrachtet. – Dan

+0

Ich stimme zu, dass dies mit der vorhandenen Control API sehr einfach zu implementieren ist. Ich wollte nur sagen, dass Ihre Herangehensweise gut ist. – bbudge

+0

Danke für Ihre Beschreibung des Observer-Patterns. – Dan

1

Sie können einen Blick auf die nehmen wollen:

  1. Facade Pattern
  2. Decorator pattern
  3. Observer pattern

Die Fassade Muster ermöglicht es Ihnen das Verhalten der Steuer einzukapseln unter die aktuelle Klasse. Mit dem Decorator-Muster können Sie stapelbare Steuerelemente erstellen. Mit dem Beobachtermuster können Sie Ereignisse verwalten.

+0

Das Fassadenmuster wird die Funktionalität innerhalb eines Steuerelements nicht gut kapseln, da das Fassadenmuster zwischen Methodenaufrufen für das Steuerelement keinen Status enthalten sollte (gemäß meiner Anforderung wie angegeben). In Anbetracht meiner Beschreibung würde die Verwendung des Beobachtermusters in diesem Szenario überhaupt keinen Sinn ergeben. Der Dekorateur, ok vielleicht könnte dieser eine geeignet sein;) .... Wenn ich falsch liege, bitte sag mir, wie ich möchte ein besseres Verständnis von, wie Sie vorschlagen würde, dies mit diesen Mustern zu implementieren. – Dan

+0

Eigentlich denke ich, Steven ist ziemlich genau hier. Sie verwenden die Fassade, um die einheitliche Schnittstelle für die UI-Steuerelemente zu erstellen (denken Sie an: UserControl). Das Konzept des Dekorators ähnelt der Verwendung der 3rd Party über Komposition und Hinzufügen spezifischer Funktionalität. Observer wird verwendet, um das Steuerelement auf oberster Ebene dazu zu veranlassen, zu reagieren, wenn ein Ereignis auf dem Steuerelement des Drittanbieters auftritt. –

+0

Ich verstehe, wo Observer jetzt hineinpasst. Obwohl meine Lösung technisch gesehen Beobachter ist, kann das Forms-Event-Modell in .NET als Observer-Muster betrachtet werden. Ein anderes Observer-Muster in den Fehler einzufügen macht keinen Sinn, da meine Lösung bereits ziemlich einfach ist und bereits ein Observer-Modell verwendet. – Dan

0

Ich denke, dass das Observer-Muster hilfreich sein sollte. Dies ist, wie Sie es verwenden können:

UtilityClass, die eine Kontrolle übernimmt (wie Sie erwähnt haben): es Beobachter

verschiedenen Utility-Klassen Register (und damit Kontrollen) zu verschiedenen Events es ist interessiert an:

Jetzt, wenn ein bestimmtes Ereignis auftritt, aktualisiert es verschiedene Beobachter, wo Sie das grundlegende EventHandling an das Steuerelement delegieren können, das es umwickelt und auch einen Ort, um benutzerdefinierte Handl zu tun haben basierend auf der Kontrolle und dem Ereignis.

Verwandte Themen