소프트웨어에 사용되는 디자인 패턴의 실제 사례는 무엇입니까 [닫기]

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

  •  09-06-2019
  •  | 
  •  

문제

나는 지금 머리부터 디자인 패턴을 읽고 있습니다. 책은 훌륭하지만 이것이 실제로 현실 세계에서 어떻게 사용되는지 보고 싶습니다.

디자인 패턴 사용의 좋은 예를 알고 있다면(우리가 살펴볼 수 있도록 OSS 프로그램을 사용하는 것이 좋습니다) 아래에 나열해 주십시오.

도움이 되었습니까?

해결책

관찰자 패턴에 대해 저에게 아하 순간은 그것이 이벤트와 얼마나 밀접하게 연관되어 있는지 깨닫는 것이었습니다.두 형식 간의 느슨하게 통신을 달성해야 하는 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)과 같은 웹 양식을 사용하는 패턴

예를 들어, 코드 숨김 파일은 다음과 같을 수 있습니다.

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 이벤트 처리에서 구현됩니다.예를 들어 (약간 단순화하면) 요소를 클릭하면 해당 요소가 이벤트를 처리할 수 있는 첫 번째 기회를 얻은 다음 최상위 수준까지 tern의 각 조상을 얻습니다. 문서 도달했거나 그 중 하나가 이벤트 "버블링"을 더 이상 명시적으로 중지합니다.

C#, Java 및 Python에는 Iterator 패턴의 표준 구현이 있습니다.C# 및 Python에서는 이것이 언어에 통합되어 있으므로 항복 반환 문만 사용할 수 있습니다.

템플릿 패턴은 전제 조건을 설정하고 사후 조건에 응답하기 위해 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
}

Python에 익숙하다면 Twisted 프레임워크를 확인해 보세요.http://twistedmatrix.com/trac/

아마도 좋은 예가 될 것입니다. 헤드 퍼스트 디자인 패턴 역시, 이다 자바 스윙 API 이는 관찰자 무늬.보다 구체적으로 JButton(또는 상위 클래스 AbstractButton)은 Observable 클래스이며 Swing에서 호출되는 "관찰자" 또는 "청취자"를 추가 및 제거하는 메소드를 제공합니다.

복합재는 UI에서 광범위하게 사용됩니다.구성 요소는 리프 구성 요소일 수 있습니다.버튼과 라벨 또는 합성물(예:다른 리프 또는 복합 구성요소를 포함할 수 있는 패널.클라이언트의 관점에서는 모든 구성 요소가 동일하게 처리되므로 클라이언트 코드가 크게 단순화됩니다.

명령 패턴은 실행 취소 기능이 있는 모든 곳에서 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top