7

私は現在、頭から先のデザインパターンを読んでいます。この本は優れていますが、実際にこれらが実際にどのように使用されているかも見てみたいと思います。

デザインパターンの使用法の良い例を知っている場合(できればOSSプログラムで見てみましょう:)、以下にリストしてください。

4

10 に答える 10

3

オブザーバーパターンの私にとってのああはは、それがイベントとどれほど密接に関連しているかを理解することでした。2つのフォーム間の大まかな通信を実現する必要がある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;
        }
    }
}
于 2008-08-30T17:17:25.913 に答える
3

モデルビュープレゼンターパターンのフレーバーであるパッシブビューを、開発(.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
于 2008-08-30T17:43:12.090 に答える
3

Chain of Responsibilityパターンは、DOM イベントの処理に実装されています。たとえば、(少し単純化すると) 要素がクリックされると、その要素はイベントを処理する最初の機会を取得し、次に各祖先は最上位のドキュメントに到達するか、それらのいずれかがイベントの「バブリング」を明示的に停止するまで待機します。それ以上。

于 2008-08-30T20:01:58.497 に答える
3

code.google.com を使用する

例えば「ファクトリー」で検索すると、ファクトリーパターンが実装されているケースが多く出てきます。

于 2008-08-30T19:31:46.650 に答える
1

C#、Java、および Python には、Iterator パターンの標準実装があります。C# と Python では、これは言語に統合されているため、yield return ステートメントを使用できます。

于 2008-08-31T00:55:12.240 に答える
1

Python に精通している場合は、Twisted フレームワークを調べてください。 http://twistedmatrix.com/trac/

于 2008-09-22T12:14:28.183 に答える
1

テンプレート パターンは、ドットネット イベントの実装で一般的に使用され、前提条件を設定し、事後条件に応答します。退化しているケースは

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

前提条件がチェックされます。この場合の前提条件は、少なくとも 1 つのハンドラーがバインドされている場合にのみ、ハンドラーを呼び出すことができるということです。(ハンドラーを非同期で呼び出す必要があるとは言わないでください。私はそれを知っています。非同期プログラミング手法ではなく、テンプレート パターンを示しています。)

より複雑な前提条件には、イベントの発生を制御するプロパティのチェックが含まれる場合があります。

テンプレートパターンは、フックを実装するためにもよく使用されます。たとえば、

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
}
于 2008-09-22T05:53:22.640 に答える
1

Head First Design Patternsでも指摘されているように、 Observerパターンを実装するJava Swing APIがおそらく良い例です。より具体的には、JButton (またはスーパークラス AbstractButton) は Observable クラスであり、Swing で呼び出される「オブザーバー」または「リスナー」を追加および削除するメソッドを提供します。

于 2009-09-13T20:59:30.487 に答える
0

コンポジットは、UI で広く使用されています。コンポーネントは、ボタンやラベルなどのリーフ コンポーネント、またはパネルなどのコンポジットであり、他のリーフまたはコンポジット コンポーネントを含むことができます。クライアントの観点からは、すべてのコンポーネントが同じように扱われるため、クライアント コードが大幅に簡素化されます。

于 2008-09-07T09:27:37.067 に答える
0

Command パターンは、元に戻す機能があるすべての場所で使用されます。

于 2008-09-22T12:06:41.523 に答える