ソフトウェアで使用されるデザイン パターンの実例は何ですか [終了]

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

  •  09-06-2019
  •  | 
  •  

質問

私は現在、head first デザイン パターンを読んでいます。この本は素晴らしいのですが、実際にこれらが現実の世界でどのように使用されるか見てみたいと思っています。

デザインパターンの使用例をご存知の場合は (できれば OSS プログラムで使用してください:)、以下にリストしてください。

役に立ちましたか?

解決

私にとってオブザーバー パターンについて「なるほど」と思ったのは、それがイベントといかに密接に関連しているかを認識したことでした。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;
        }
    }
}

他のヒント

私はパッシブビューを使用します。 モデルビュープレゼンター 開発 (.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

code.google.com を使用する

たとえば、 検索結果 「Factory」の場合は、ファクトリーパターンが実装されているケースが多く表示されます。

責任の連鎖 パターンは DOM イベントの処理に実装されます。たとえば、(少し単純化して)要素がクリックされると、その要素がイベントを処理する最初の機会を取得し、その後、最上位レベルまで順番に各祖先がイベントを処理する機会を取得します。 書類 に達するか、それらのいずれかがそれ以上のイベントの「バブリング」を明示的に停止します。

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

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

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
}

Python に詳しい場合は、Twisted フレームワークをチェックしてください。http://twistedmatrix.com/trac/

おそらく良い例として、で指摘されているように、 ヘッドファーストのデザインパターン もです。 JAVAスイングAPI を実装するもの 観察者 パターン。より具体的には、JButton (またはスーパークラス AbstractButton) は Observable クラスであり、Swing で呼び出される「オブザーバー」または「リスナー」を追加および削除するメソッドを提供します。

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

コマンド パターンは、元に戻す機能があるあらゆる場所で使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top