O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

2.418 visualizações

Publicada em

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

Publicada em: Tecnologia
  • Entre para ver os comentários

  • Seja a primeira pessoa a gostar disto

Шаблоны проектирования 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>

×