ソフトウェアで使用されるデザイン パターンの実例は何ですか [終了]
-
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 で広く使用されています。コンポーネントはリーフコンポーネントにすることができます。ボタンとラベル、または複合物 例:パネルには、他のリーフ コンポーネントや複合コンポーネントを含めることができます。クライアントの観点からは、すべてのコンポーネントが同じように扱われるため、クライアント コードが大幅に簡素化されます。
コマンド パターンは、元に戻す機能があるあらゆる場所で使用されます。