Quais são alguns exemplos da vida real de padrões de design usados ​​em software [fechado]

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

  •  09-06-2019
  •  | 
  •  

Pergunta

No momento, estou lendo padrões de design de cabeça e, embora o livro seja excelente, também gostaria de ver como eles são realmente usados ​​no mundo real.

Se você conhece um bom exemplo de uso de padrões de design (de preferência em um programa OSS para que possamos dar uma olhada :), liste-o abaixo.

Foi útil?

Solução

Para mim, um momento de ah-ha para o padrão do observador foi perceber o quão intimamente ele está associado aos eventos.Considere um programa do Windows que precisa obter comunicações flexíveis entre dois formulários.Isso pode ser facilmente conseguido com o padrão observador.

O código abaixo mostra como o Form2 dispara um evento e qualquer outra classe registrada como observador obtém seus dados.

Veja este link para um ótimo recurso de padrões:http://sourcemaking.com/design-patterns-and-tips

Código do 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 );            
        }
    }
}

Código do 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;
        }
    }
}

Outras dicas

Eu uso a visão passiva, um sabor do Apresentador de visualização de modelo padrão, com qualquer formulário da web como desenvolvimento (.NET) para aumentar a testabilidade/manutenção/etc

Por exemplo, seu arquivo code-behind pode ser parecido com isto

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

Este código por trás está agindo como uma visão muito fina com lógica zero.Em vez disso, essa lógica é inserida em uma classe de apresentador que pode ser testada em unidade.

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

Use code.google.com

Por exemplo o resultado da pesquisa para "Factory" você terá muitos casos em que o padrão de fábrica é implementado.

O Cadeia de Responsabilidade padrão é implementado no tratamento de eventos DOM.Por exemplo, (e simplificando um pouco) quando um elemento é clicado, esse elemento tem a primeira oportunidade de manipular o evento e, em seguida, cada ancestral em tern até o nível superior documento é alcançado ou um deles interrompe explicitamente o "borbulhamento" do evento.

C#, Java e Python possuem uma implementação padrão do padrão Iterator.Em C# e Python, isso foi integrado à linguagem para que você possa usar apenas instruções de retorno de rendimento.

O padrão de modelo é comumente usado na implementação de eventos dotnet para configurar pré-condições e responder a pós-condições.O caso degenerado é

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

em que a pré-condição é verificada.Neste caso, a pré-condição é que os manipuladores possam ser invocados somente quando pelo menos um tiver sido vinculado.(Por favor, não me diga que devo invocar os manipuladores de forma assíncrona.Eu sei que.Estou ilustrando o padrão Template, não a técnica de programação assíncrona.)

Uma pré-condição mais elaborada pode envolver a verificação de uma propriedade que rege o disparo de eventos.

O padrão de modelo também é comumente usado para implementar ganchos, por exemplo

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
}

Se você estiver familiarizado com Python, confira a estrutura Twisted.http://twistedmatrix.com/trac/

Talvez um bom exemplo, como apontado no Use a cabeça primeiro, padrões de design também, é o API Swing JAVA que implementa o Observador padrão.Mais especificamente, o JButton (ou a superclasse AbstractButton) é a classe Observable e fornece métodos para adicionar e remover "Observers" ou "Listeners", como são chamados no Swing.

Composite é amplamente usado na UI.Os componentes podem ser componentes folha, e.botões e rótulos ou compostos, por ex.painéis, que podem conter outras folhas ou componentes compostos.Do ponto de vista do cliente, todos os componentes são tratados da mesma forma, o que simplifica bastante o código do cliente.

O padrão Command é usado em todos os lugares onde você tem a funcionalidade Desfazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top