Quais são alguns exemplos da vida real de padrões de design usados em software [fechado]
-
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.
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.