Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,087 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

×