软件中使用的设计模式的一些实际例子是什么?

时间:2008-08-30 16:51:19

标签: design-patterns

我现在正在阅读首要的设计模式,虽然这本书非常出色,但我也希望看到它们在现实世界中是如何实际应用的。

如果您知道设计模式使用的一个很好的例子(最好是在OSS程序中,以便我们可以查看:),请在下面列出。

10 个答案:

答案 0 :(得分:3)

对于我来说,观察者模式的一个例子就是要意识到它与事件的紧密联系。考虑一个需要在两个表单之间进行松散通信的Windows程序。这可以通过观察者模式轻松完成。

下面的代码显示了Form2如何触发事件以及注册为观察者的任何其他类获取其数据。

请参阅此链接以获取出色的模式资源: http://sourcemaking.com/design-patterns-and-tips

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 );            
        }
    }
}

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;
        }
    }
}

答案 1 :(得分:3)

我使用被动视图,Model View Presenter模式的风格,与开发(.NET)等任何Web表单一起提高可测试性/可维护性等等

例如,您的代码隐藏文件可能看起来像这样

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

这个代码背后是一个非常薄的视图,逻辑为零。相反,这个逻辑被推送到可以进行单元测试的演示者类中。

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

答案 2 :(得分:3)

使用code.google.com

例如,“Factory”的search result将为您提供很多实施工厂模式的案例。

答案 3 :(得分:3)

责任链模式是在处理DOM事件时实现的。例如,(并略微简化)单击元素时,该元素首先获得处理事件的机会,然后是每个祖先,直到达到顶级文档或其中一个明确地停止事件“冒泡”。

答案 4 :(得分:1)

C#,Java和Python具有Iterator模式的标准实现。在C#和Python中,这已经在语言中集成,因此您可以使用yield return语句。

答案 5 :(得分:1)

模板模式通常用于实现dotnet事件,以设置前置条件并响应后置条件。退化的情况是

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

其中检查前提条件。在这种情况下,前提条件是只有在绑定了至少一个处理程序时才能调用处理程序。 (请不要告诉我,我应该异步调用处理程序。我知道。我正在说明模板模式,而不是异步编程技术。)

更复杂的前提条件可能涉及检查控制事件触发的属性。

模板模式也常用于实现钩子,例如

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
}

答案 6 :(得分:1)

如果您熟悉Python,请查看Twisted框架。 http://twistedmatrix.com/trac/

答案 7 :(得分:1)

正如Head First Design Patterns中所指出的,也许一个很好的例子是 JAVA Swing API ,它实现了 Observer 模式。更具体地说,JButton(或超类AbstractButton)是Observable类,并提供了在Swing中调用它们时添加和删除“Observers”或“Listeners”的方法。

答案 8 :(得分:0)

Composite在UI中广泛使用。组分可以是叶组分,例如按钮和标签或复合材料,例如面板,可包含其他叶片或复合组件。从客户端的角度来看,所有组件都被视为相同,这极大地简化了客户端代码。

答案 9 :(得分:0)

命令模式用于任何具有撤消功能的地方。