Quels sont quelques exemples réels de modèles de conception utilisés dans les logiciels [fermé]

StackOverflow https://stackoverflow.com/questions/36129

  •  09-06-2019
  •  | 
  •  

Question

Je lis tête première les modèles de conception en ce moment et bien que le livre soit excellent, j'aimerais également voir comment ils sont réellement utilisés dans le monde réel.

Si vous connaissez un bon exemple d'utilisation de modèle de conception (de préférence dans un programme OSS afin que nous puissions y jeter un œil :), veuillez le lister ci-dessous.

Était-ce utile?

La solution

Un moment ah-ha pour moi pour le modèle d’observateur a été de réaliser à quel point il est étroitement associé aux événements.Considérons un programme Windows qui doit établir des communications souples entre deux formulaires.Cela peut facilement être accompli avec le modèle d'observateur.

Le code ci-dessous montre comment Form2 déclenche un événement et comment toute autre classe enregistrée en tant qu'observateur obtient ses données.

Consultez ce lien pour une excellente ressource de modèles :http://sourcemaking.com/design-patterns-and-tips

Le code du Form1 :

namespace PublishSubscribe
{
    public partial class Form1 : Form
    {
        Form2 f2 = new Form2();

        public Form1()
        {
            InitializeComponent();

            f2.PublishData += new PublishDataEventHander( DataReceived );
            f2.Show();
        }

        private void DataReceived( object sender, Form2EventArgs e )
        {
            MessageBox.Show( e.OtherData );            
        }
    }
}

Le code de Form2

namespace PublishSubscribe
{

    public delegate void PublishDataEventHander( object sender, Form2EventArgs e );

    public partial class Form2 : Form
    {
        public event PublishDataEventHander PublishData;

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender, EventArgs e )
        {
            PublishData( this, new Form2EventArgs( "data from form2" ) );    
        }
    }

    public class Form2EventArgs : System.EventArgs
    {
        public string OtherData;

        public Form2EventArgs( string OtherData )        
        {
            this.OtherData = OtherData;
        }
    }
}

Autres conseils

J'utilise la vue passive, une saveur du Présentateur de vue modèle modèle, avec n'importe quel formulaire Web comme le développement (.NET) pour augmenter la testabilité/maintenabilité/etc

Par exemple, votre fichier code-behind pourrait ressembler à ceci

Partial Public Class _Default
    Inherits System.Web.UI.Page
    Implements IProductView

    Private presenter As ProductPresenter

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)
        presenter = New ProductPresenter(Me)
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        presenter.OnViewLoad()
    End Sub

    Private ReadOnly Property PageIsPostBack() As Boolean Implements IProductView.PageIsPostBack
        Get
            Return Page.IsPostBack
        End Get
    End Property

    Public Property Products() As System.Collections.Generic.List(Of Product) Implements Library.IProductView.Products
        Get
            Return DirectCast(gridProducts.DataSource(), List(Of Product))
        End Get
        Set(ByVal value As System.Collections.Generic.List(Of Product))
            gridProducts.DataSource = value
            gridProducts.DataBind()
        End Set
    End Property
End Class

Ce code derrière agit comme une vue très fine sans logique.Cette logique est plutôt poussée dans une classe de présentateur qui peut être testée unitairement.

Public Class ProductPresenter
    Private mView As IProductView
    Private mProductService As IProductService

    Public Sub New(ByVal View As IProductView)
        Me.New(View, New ProductService())
    End Sub

    Public Sub New(ByVal View As IProductView, ByVal ProductService As IProductService)
        mView = View
        mProductService = ProductService
    End Sub

    Public Sub OnViewLoad()
        If mView.PageIsPostBack = False Then
            PopulateProductsList()
        End If
    End Sub

    Public Sub PopulateProductsList()
        Try
            Dim ProductList As List(Of Product) = mProductService.GetProducts()
            mView.Products = ProductList
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

Utilisez code.google.com

Par exemple le résultat de la recherche pour "Factory", vous obtiendrez de nombreux cas où le modèle d'usine est implémenté.

Le Chaîne de responsabilité Le modèle est implémenté dans la gestion des événements DOM.Par exemple, (et en simplifiant légèrement) lorsqu'un élément est cliqué, cet élément a la première opportunité de gérer l'événement, puis chaque ancêtre jusqu'au niveau supérieur. document est atteint ou l'un d'eux arrête explicitement le "bullage" de l'événement.

C#, Java et Python ont une implémentation standard du modèle Iterator.En C# et Python, cela a été intégré au langage afin que vous puissiez simplement utiliser les instructions rendement-retour.

Le modèle de modèle est couramment utilisé dans la mise en œuvre d’événements dotnet pour définir des conditions préalables et répondre aux postconditions.Le cas dégénéré est

void FireMyEvent(object sender, EventArgs e) 
{
  if (_myevent != null) _myEvent(sender, e);
}

dans lequel la condition préalable est vérifiée.Dans ce cas, la condition préalable est que les gestionnaires ne puissent être invoqués que lorsqu'au moins un a été lié.(S'il vous plaît, ne me dites pas que je devrais appeler les gestionnaires de manière asynchrone.Je sais que.J'illustre un modèle de modèle, pas une technique de programmation asynchrone.)

Une condition préalable plus élaborée pourrait impliquer de vérifier une propriété qui régit le déclenchement des événements.

Le modèle de modèle est également couramment utilisé pour implémenter des hooks, par exemple

public virtual void BeforeOpenFile(string filepath)
{
  //stub
}
public virtual void AfterOpenFile(string filepath)
{
  //stub
}
public sealed void OpenFile(string filepath) 
{
  BeforeOpenFile(filepath); //do user customisable pre-open bits
  //do standard bits here
  AfterOpenFile(filepath); //do user customisable post-open bits
}

Si vous êtes familier avec Python, consultez le framework Twisted.http://twistedmatrix.com/trac/

Peut-être un bon exemple, comme le souligne le Modèles de conception tête première aussi, c'est le API JAVA Swing qui met en œuvre le Observateur modèle.Plus précisément, le JButton (ou la superclasse AbstractButton) est la classe Observable et fournit des méthodes pour ajouter et supprimer des « observateurs » ou des « auditeurs » comme on les appelle dans Swing.

Le composite est largement utilisé dans l’interface utilisateur.Les composants peuvent être des composants feuilles, par ex.boutons et étiquettes ou composites, par ex.panneaux, qui peuvent contenir d’autres composants vantaux ou composites.Du point de vue du client, tous les composants sont traités de la même manière, ce qui simplifie grandement le code client.

Le modèle de commande est utilisé partout où vous disposez de la fonctionnalité d'annulation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top