Каковы некоторые реальные примеры шаблонов проектирования, используемых в программном обеспечении [закрыто]
-
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 используется везде, где есть функция отмены.