Каковы некоторые реальные примеры шаблонов проектирования, используемых в программном обеспечении [закрыто]

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

Другие советы

Я использую пассивное представление, разновидность Presenter представления модели шаблон, с любыми веб-формами, такими как разработка (.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

Например, результат поиска для " Фабрика " вы получите множество случаев, когда реализован фабричный шаблон.

Шаблон Цепочка ответственности реализован в обработке событий DOM. Например, (и слегка упрощая) при нажатии на элемент этот элемент получает первую возможность обработать событие, а затем каждого предка в крачке, пока не будет достигнут документ верхнего уровня или один из них. явным образом останавливает событие «всплеск» дальше.

C #, Java и Python имеют стандартную реализацию шаблона Iterator. В C # и Python это интегрировано в язык, так что вы можете просто использовать операторы yield return.

Шаблон шаблона обычно используется при реализации событий 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 Framework. http://twistedmatrix.com/trac/

Возможно, хороший пример, как указывалось в шаблонах проектирования «Первые в голове» также это JAVA Swing API , который реализует шаблон Observer . Более конкретно, JButton (или суперкласс AbstractButton) является классом Observable и предоставляет методы для добавления и удаления «Observers» или «Listeners». как они называются в Swing.

Композитный широко используется в пользовательском интерфейсе. Компоненты могут быть листовыми компонентами, например кнопки и метки или композиты, например панели, которые могут содержать другие листовые или композитные компоненты. С точки зрения клиента все компоненты обрабатываются одинаково, что значительно упрощает клиентский код.

Шаблон Command используется везде, где есть функция отмены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top