Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Шаблоны проектирования 1

2.416 Aufrufe

Veröffentlicht am

Лекция Михаила Гуренкова по шаблонам проектирования в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.

Veröffentlicht in: Technologie
  • Loggen Sie sich ein, um Kommentare anzuzeigen.

  • Gehören Sie zu den Ersten, denen das gefällt!

Шаблоны проектирования 1

  1. 1. Шаблоны проектирования
  2. 2. Шаблоны проектирования <ul><li>абстракция объектов, классов и их взаимодействия </li></ul><ul><li>удачные типовые решения определенных задач в определенном контексте </li></ul><ul><li>элементы архитектуры </li></ul>
  3. 4. Виды шаблонов <ul><li>порождающие </li></ul><ul><li>структурные </li></ul><ul><li>поведения </li></ul><ul><li>………… . </li></ul>
  4. 5. Factory (фабрика) <ul><li>public static XParser Create(string a_ParserName) </li></ul><ul><li>{ </li></ul><ul><li>if (a_ParserName == &quot;XUnitelParser&quot;) </li></ul><ul><li>{ </li></ul><ul><li>return new XUnitelParser(); </li></ul><ul><li>} </li></ul><ul><li>if (a_ParserName == &quot;XDxParser&quot;) </li></ul><ul><li>{ </li></ul><ul><li>return new XDxParser(); </li></ul><ul><li>} </li></ul><ul><li>if (a_ParserName == &quot;XUnitelFlashParser&quot;) </li></ul><ul><li>{ </li></ul><ul><li>return new XUnitelFlashParser(); </li></ul><ul><li>} </li></ul><ul><li>throw new Exception(&quot;Неизвестный парсер &quot; + a_ParserName); </li></ul><ul><li>} </li></ul>
  5. 6. Factory (фабрика) <ul><li>public static XDocumentConflictFindingStrategy Create(XDocument a_Document) </li></ul><ul><li>{ </li></ul><ul><li>if (a_Document.Type.Category == DocumentCategory.Billing) </li></ul><ul><li>{ </li></ul><ul><li>return new XBillingConflictFindingStrategy(a_Document); </li></ul><ul><li>} </li></ul><ul><li>if (a_Document.Order != null) </li></ul><ul><li>{ </li></ul><ul><li>return new XOrderConflictFindingStrategy(a_Document); </li></ul><ul><li>} </li></ul><ul><li>return new XAccountingConflictFindingStrategy(a_Document); </li></ul><ul><li>} </li></ul>
  6. 7. Factory (фабрика) <ul><li>класс-клиент не знает, какие типы объектов ему нужно создавать </li></ul><ul><li>класс-клиент спроектирован с учетом делегирования обязанностей подклассам </li></ul><ul><li>инкапсуляция логики создания нового объекта в одном участке кода </li></ul>
  7. 8. Abstract Factory
  8. 9. Abstract Factory ( абстрактная фабрика ) <ul><li>List<IExtendedFilterTemplate> m_Templates = new List<IExtendedFilterTemplate>(); </li></ul><ul><li>m_Templates.Add(new XExtendedFilterTemplate(&quot; Производитель &quot;, </li></ul><ul><li>new IRelation[] { new XEqualsRelation(&quot;Producer&quot;, &quot;равен&quot;), new XDoesNotEqualRelation(&quot;Producer&quot;, &quot;не равен&quot;), new XBeginsRelation(&quot;Producer&quot;), new XContainRelation(&quot;Producer&quot;) }, </li></ul><ul><li>new XComboBoxControlBuilder(new XTableFieldDataSource(new DB.vProducers(), DB.vProducers.NameColumn)) )); </li></ul><ul><li>m_Templates.Add(new XExtendedFilterTemplate(&quot;PartNumber&quot;, </li></ul><ul><li>new IRelation[] { new XEqualsRelation(&quot;PartNumber&quot;, &quot;равен&quot;), new XDoesNotEqualRelation(&quot;PartNumber&quot;, &quot;не равен&quot;), new XBeginsRelation(&quot;PartNumber&quot;) }, </li></ul><ul><li>new XFilterControlBuilder<XFilterTextBoxControl>() )); </li></ul><ul><li>m_Templates.Add(new XExtendedFilterTemplate(&quot; Код товара &quot;, </li></ul><ul><li>new IRelation[] { new XEqualsRelation(&quot;ItemNum&quot;, &quot;равен&quot;), new XDoesNotEqualRelation(&quot;ItemNum&quot;, &quot;не равен&quot;), new XIsNullRelation(&quot;ItemNum&quot;), new XIsNotNullRelation(&quot;ItemNum&quot;) }, </li></ul><ul><li>new XNumberControlBuilder(false) )); </li></ul>
  9. 10. Abstract Factory ( абстрактная фабрика ) <ul><li>Интерфейсы: </li></ul><ul><li>IDbCommand, IDbTransaction, IDbConnection </li></ul><ul><li>Конкретные классы: </li></ul><ul><li>— ADO.NET: SqlCommand, SqlTransaction, SqlConnection </li></ul><ul><li>— ORACLE: OracleCommand, OracleTransaction, OracleConnection </li></ul><ul><li>— MySQL: MysqlCommand, MysqlTransaction, MysqlConnection </li></ul>
  10. 11. Abstract Factory ( абстрактная фабрика ) <ul><li>interface IDataBaseImplementation </li></ul><ul><li>{ </li></ul><ul><li>DbDataAdapter GetAdapterForSelect(IDbCommand a_SelectCommand); </li></ul><ul><li>DbDataAdapter GetAdapterForUpdate(DataTable a_Table, XTransaction a_Transaction); </li></ul><ul><li>DbDataAdapter GetAdapterForBatchUpdate(DataTable a_Table); </li></ul><ul><li>IDbCommand GetDbCommand(string a_CommandText); </li></ul><ul><li>IDbCommand GetDbCommand(string a_CommandText, XTransaction a_Transaction); </li></ul><ul><li>IDbCommand GetDbCommand(string a_CommandText, XPermanentConnection a_Connection); </li></ul><ul><li>IDbConnection GetConnection(string a_ConnectionString); </li></ul><ul><li>IDataParameter GetParameter(string a_Name, object a_Value); </li></ul><ul><li>IDbTransaction GetTransaction(); </li></ul><ul><li>} </li></ul>
  11. 12. Abstract Factory ( абстрактная фабрика ) <ul><li>система не зависит от способа создания, компоновки и представления объектов </li></ul><ul><li>объекты должны использоваться семействами </li></ul><ul><li>система конфигурируется семейством объектов </li></ul><ul><li>сокрытие реализации объектов </li></ul>
  12. 13. Singleton (одиночка) <ul><li>public class XSecurityManager </li></ul><ul><li>{ </li></ul><ul><li>static XSecurityManager m_Instance = null; </li></ul><ul><li>public static XSecurityManager Instance </li></ul><ul><li>{ </li></ul><ul><li>get </li></ul><ul><li>{ </li></ul><ul><li>if (m_Instance == null) </li></ul><ul><li>{ </li></ul><ul><li>m_Instance = new XSecurityManager(); </li></ul><ul><li>} </li></ul><ul><li>return m_Instance; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>XSecurityManager() </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>public virtual bool IsActionAllowed( XAction a_Action) </li></ul><ul><li>{ </li></ul><ul><li>return ... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  13. 14. Singleton (одиночка) <ul><li>public class XSecurityManager </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>public static XSecurityManager Instance </li></ul><ul><li>{ </li></ul><ul><li>get </li></ul><ul><li>{ </li></ul><ul><li>if (m_Instance == null) </li></ul><ul><li>{ </li></ul><ul><li>m_Instance = new XSecurityManagerForTesting (); </li></ul><ul><li>} </li></ul><ul><li>return m_Instance; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>public class XSecurityManagerForTesting : XSecurityManager </li></ul><ul><li>{ </li></ul><ul><li>public override bool IsActionAllowed(object a_Action) </li></ul><ul><li>{ </li></ul><ul><li>return true; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  14. 15. Singleton (одиночка) <ul><li>class XCompany </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>m_Groups = new XObjectCollection </li></ul><ul><li><XCompany, XCompanyGroup, DB.xCompaniesToCategories> </li></ul><ul><li>(this, XCompanyGroupRepostitory.Instance, &quot;id_Company&quot;, &quot;id_Category&quot;); </li></ul>
  15. 16. Singleton (одиночка) <ul><li>должен быть только один экземпляр класса </li></ul><ul><li>класс должен расширяться наследованием </li></ul>
  16. 17. Lazy Load ( загрузка по требованию ) <ul><li>IList<XOrderService> m_Services = null; </li></ul><ul><li>public IList<XOrderService> Services </li></ul><ul><li>{ </li></ul><ul><li>get </li></ul><ul><li>{ </li></ul><ul><li>if (m_Services == null) </li></ul><ul><li>{ </li></ul><ul><li>m_Services = GetServices(); </li></ul><ul><li>} </li></ul><ul><li>return m_Services; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>

×