Шаблоны проектирования Часть вторая
Порождающие шаблоны <ul><li>—  Factory ( фабрика, фабричный метод) </li></ul><ul><li>—  Abstract Factory  (абстрактная фаб...
Façade  (фасад)
Façade  (фасад) <ul><li>class TreeNode </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>class SearchResult </li><...
Façade  (фасад) <ul><li>—  Предоставить более удобный интерфейс для использования библиотеки, за счет наличия специальных ...
Composite ( компоновщик)
Composite ( компоновщик) <ul><li>select  *  from  Companies  </li></ul><ul><li>where  (IsClient = 1  or  IsFormerClient = ...
Composite ( компоновщик) <ul><li>IsClient = 1  or  IsFormerClient = 1)  and  IsDeleted = 0  and  id_Object = 103 </li></ul>
Composite ( компоновщик) <ul><li>interface IFilter </li></ul><ul><li>{ </li></ul><ul><li>string GetSql(); </li></ul><ul><l...
Composite ( компоновщик) <ul><li>class ScalarFilter : IFilter </li></ul><ul><li>{ </li></ul><ul><li>string m_Sql; </li></u...
Composite ( компоновщик) <ul><li>class AndFilter : ICompositeFilter </li></ul><ul><li>{ </li></ul><ul><li>List<IFilter> m_...
Composite ( компоновщик) <ul><li>protected IFilter GetFilterInternal() </li></ul><ul><li>{  </li></ul><ul><li>XAndFilter r...
Composite ( компоновщик) <ul><li>Компоновщик — это круто! </li></ul>
Ахтунг! <ul><li>public class XScalarFilter : IFilter </li></ul><ul><li>{ </li></ul><ul><li>string m_Command; </li></ul><ul...
Задача
Command ( команда) <ul><li>interface ICommand </li></ul><ul><li>{ </li></ul><ul><li>void Run(); </li></ul><ul><li>} </li><...
Command ( команда) <ul><li><?xml version='1.0' encoding='windows-1251'?> </li></ul><ul><li><template> </li></ul><ul><li><p...
Command ( команда)
Плагины <ul><li>[TemplateItem(TemplateKind.ExcelSpreadsheet, &quot;Cell&quot;)] </li></ul><ul><li>public class XCellTempla...
Плагины <ul><li>Type FindTypeByName(string a_Name) </li></ul><ul><li>{ </li></ul><ul><li>foreach (Type type in GetType().A...
Template Method  ( шаблонный метод) <ul><li>abstract class Game  </li></ul><ul><li>{  </li></ul><ul><li>protected int play...
Template Method  ( шаблонный метод) <ul><li>abstract public class XParser </li></ul><ul><li>{ </li></ul><ul><li>public XCa...
Strategy ( стратегия) <ul><li>class XDocumentConflictManager </li></ul><ul><li>{ </li></ul><ul><li>public XDocumentConflic...
Strategy ( стратегия) <ul><li>public abstract class XDocumentConflictFindingStrategy </li></ul><ul><li>{ </li></ul><ul><li...
Strategy ( стратегия) <ul><li>public class XBillingConflictFindingStrategy : XDocumentConflictFindingStrategy </li></ul><u...
Upcoming SlideShare
Loading in...5
×

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

1,739

Published on

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

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,739
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Шаблоны проектирования Часть вторая
  2. 2. Порождающие шаблоны <ul><li>— Factory ( фабрика, фабричный метод) </li></ul><ul><li>— Abstract Factory (абстрактная фабрика) </li></ul><ul><li>— Singleton ( одиночка) </li></ul><ul><li>— Lazy Load ( загрузка по требованию) </li></ul>
  3. 3. Façade (фасад)
  4. 4. Façade (фасад) <ul><li>class TreeNode </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>class SearchResult </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>static class ACAlgoritm </li></ul><ul><li>{ </li></ul><ul><li>public static TreeNode BuildTree(string[] a_Keywords) </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>public static SearchResult[] FindAll(TreeNode a_Root, string a_Text) </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class SearchAlgoritm </li></ul><ul><li>{ </li></ul><ul><li>TreeNode m_Root; </li></ul><ul><li>public SearchAlgoritm(string[] a_Keywords) </li></ul><ul><li>{ </li></ul><ul><li>m_Root = ACAlgoritm.BuildTree(a_Keywords); </li></ul><ul><li>} </li></ul><ul><li>public SearchResult[] FindAll(string a_Text) </li></ul><ul><li>{ </li></ul><ul><li>return ACAlgoritm.FindAll(m_Root, a_Text); </li></ul><ul><li>} </li></ul><ul><li>public static SearchResult[] FindAll( </li></ul><ul><li>string[] a_Keywords, string a_Text) </li></ul><ul><li>{ </li></ul><ul><li>return ACAlgoritm.FindAll( </li></ul><ul><li>ACAlgoritm.BuildTree(a_Keywords), a_Text); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  5. 5. Façade (фасад) <ul><li>— Предоставить более удобный интерфейс для использования библиотеки, за счет наличия специальных удобных методов </li></ul><ul><li>— Повысить читаемость клиентского кода (повышение уровня абстракции) </li></ul><ul><li>— Снизить связанность между клиентским кодом и кодом модуля </li></ul><ul><li>— Создать собственный хорошо спроектированный API для сторонней библиотеки, у которой свой API плохо спроектирован </li></ul>
  6. 6. Composite ( компоновщик)
  7. 7. Composite ( компоновщик) <ul><li>select * from Companies </li></ul><ul><li>where (IsClient = 1 or IsFormerClient = 1) and IsDeleted = 0 and id_Object = 103 </li></ul>
  8. 8. Composite ( компоновщик) <ul><li>IsClient = 1 or IsFormerClient = 1) and IsDeleted = 0 and id_Object = 103 </li></ul>
  9. 9. Composite ( компоновщик) <ul><li>interface IFilter </li></ul><ul><li>{ </li></ul><ul><li>string GetSql(); </li></ul><ul><li>} </li></ul><ul><li>interface ICompositeFilter : IFilter </li></ul><ul><li>{ </li></ul><ul><li>void AddFilter(IFilter a_Filter); </li></ul><ul><li>} </li></ul>
  10. 10. Composite ( компоновщик) <ul><li>class ScalarFilter : IFilter </li></ul><ul><li>{ </li></ul><ul><li>string m_Sql; </li></ul><ul><li>public ScalarFilter(string a_Field, string a_Relation, object a_Value) </li></ul><ul><li>{ </li></ul><ul><li>m_Sql = string.Format(&quot;{0} {1} {2}&quot;, a_Field, a_Relation, a_Value); </li></ul><ul><li>} </li></ul><ul><li>public ScalarFilter(string a_Field, object a_Value) </li></ul><ul><li>: this (a_Field, &quot;=&quot;, a_Value) {} </li></ul><ul><li>public string GetSql() </li></ul><ul><li>{ </li></ul><ul><li>return m_Sql; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  11. 11. Composite ( компоновщик) <ul><li>class AndFilter : ICompositeFilter </li></ul><ul><li>{ </li></ul><ul><li>List<IFilter> m_Filters = new List<IFilter>(); </li></ul><ul><li>public void AddFilter(IFilter a_Filter) </li></ul><ul><li>{ </li></ul><ul><li>m_Filters.Add(a_Filter); </li></ul><ul><li>} </li></ul><ul><li>public string GetSql() </li></ul><ul><li>{ </li></ul><ul><li>string result = string.Empty; </li></ul><ul><li>foreach (IFilter filter in m_Filters) </li></ul><ul><li>{ </li></ul><ul><li>if (result != &quot;&quot;) </li></ul><ul><li>result += &quot; and &quot;; </li></ul><ul><li>result += filter.GetSql(); </li></ul><ul><li>} </li></ul><ul><li>return result; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  12. 12. Composite ( компоновщик) <ul><li>protected IFilter GetFilterInternal() </li></ul><ul><li>{ </li></ul><ul><li>XAndFilter result = new XAndFilter(); </li></ul><ul><li>if (ObjectsItemSelection.HasSelectedItems) </li></ul><ul><li>{ </li></ul><ul><li>XOrFilter objectFilter = new XOrFilter(); </li></ul><ul><li>foreach (XObject obj in ObjectsItemSelection.SelectedItems) </li></ul><ul><li>objectFilter.Add(new XScalarFilter(&quot;id_Object&quot;, obj.Id)); </li></ul><ul><li>result.Add(objectFilter); </li></ul><ul><li>} </li></ul><ul><li>if (OperatorCheckBox.Checked || ClientCheckBox.Checked || FormerClientCheckBox.Checked) </li></ul><ul><li>{ </li></ul><ul><li>XAndFilter categoryFilter = new XAndFilter(); </li></ul><ul><li>if (OperatorCheckBox.Checked) </li></ul><ul><li>categoryFilter.Add(new XScalarFilter(&quot;IsOperator&quot;, 1)); </li></ul><ul><li>if (ClientCheckBox.Checked) </li></ul><ul><li>categoryFilter.Add(new XScalarFilter(&quot;IsClient&quot;, 1)); </li></ul><ul><li>… </li></ul><ul><li>result.Add(categoryFilter); </li></ul><ul><li>} </li></ul><ul><li>if (HoldingComboBox.Text.Trim() != &quot;&quot;) </li></ul><ul><li>{ </li></ul><ul><li>result.Add(DB.Companies.HoldingFilter(HoldingComboBox.Text.Trim())); </li></ul><ul><li>} </li></ul><ul><li>… </li></ul><ul><li>return result; </li></ul><ul><li>} </li></ul>
  13. 13. Composite ( компоновщик) <ul><li>Компоновщик — это круто! </li></ul>
  14. 14. Ахтунг! <ul><li>public class XScalarFilter : IFilter </li></ul><ul><li>{ </li></ul><ul><li>string m_Command; </li></ul><ul><li>IDataParameter m_Parameter; </li></ul><ul><li>public XScalarFilter(string a_Field, string a_Relation, object a_Value) </li></ul><ul><li>{ </li></ul><ul><li>int counter = XFilter.Counter; </li></ul><ul><li>m_Command = string.Format(&quot;{0} {1} @p{2}&quot;, a_Field, a_Relation, counter); </li></ul><ul><li>m_Parameter = new SqlParameter(); </li></ul><ul><li>m_Parameter.Value = a_Value; </li></ul><ul><li>m_Parameter.ParameterName = &quot;@p&quot; + counter; </li></ul><ul><li>} </li></ul><ul><li>public XScalarFilter(string a_Field, object a_Value) </li></ul><ul><li>: this(a_Field, &quot;=&quot;, a_Value) {} </li></ul><ul><li>public string SqlText </li></ul><ul><li>{ </li></ul><ul><li>get { return m_Command; } </li></ul><ul><li>} </li></ul><ul><li>public IList<IDataParameter> Parameters </li></ul><ul><li>{ </li></ul><ul><li>get { return new IDataParameter[] { m_Parameter }; } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  15. 15. Задача
  16. 16. Command ( команда) <ul><li>interface ICommand </li></ul><ul><li>{ </li></ul><ul><li>void Run(); </li></ul><ul><li>} </li></ul><ul><li>interface ICommand </li></ul><ul><li>{ </li></ul><ul><li>void Do(); </li></ul><ul><li>void UnDo(); </li></ul><ul><li>} </li></ul><ul><li>foreach(ICommand command in GetCommands()) </li></ul><ul><li>{ </li></ul><ul><li>command.Do(); </li></ul><ul><li>} </li></ul>
  17. 17. Command ( команда) <ul><li><?xml version='1.0' encoding='windows-1251'?> </li></ul><ul><li><template> </li></ul><ul><li><parts> </li></ul><ul><li><part type=&quot;Cell&quot; cell=&quot;Contract&quot;> </li></ul><ul><li><sql>select ContractNumber from CompanyClients where id_Company = @id_Company</sql> </li></ul><ul><li></part> </li></ul><ul><li><part type=&quot;Cell&quot; cell=&quot;CompName&quot;> </li></ul><ul><li><sql>select FullName from Companies where id = @id_Company</sql> </li></ul><ul><li></part> </li></ul><ul><li><part type=&quot;Cell&quot; cell=&quot;SmallCompName&quot;> </li></ul><ul><li><sql>select FullName from Companies where id = @id_Company</sql> </li></ul><ul><li></part> </li></ul><ul><li><part type=&quot;Cell&quot; cell=&quot;Month&quot;> </li></ul><ul><li><sql>select @DateFrom</sql> </li></ul><ul><li></part> </li></ul><ul><li><part type=&quot;Table&quot; cell=&quot;AbonTable&quot; groupBy=&quot;BService&quot;> </li></ul><ul><li><sql> </li></ul><ul><li>select ... </li></ul><ul><li></sql> </li></ul><ul><li></part> </li></ul><ul><li></parts> </li></ul><ul><li></template> </li></ul>
  18. 18. Command ( команда)
  19. 19. Плагины <ul><li>[TemplateItem(TemplateKind.ExcelSpreadsheet, &quot;Cell&quot;)] </li></ul><ul><li>public class XCellTemplateItem : XTemplateItem </li></ul><ul><li>{ </li></ul><ul><li>public override void Apply() </li></ul><ul><li>{ </li></ul><ul><li>XExcelWorkDesk wd = (XExcelWorkDesk)WorkDesk; </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>[TemplateItem(TemplateKind.ExcelSpreadsheet, &quot;Table&quot;)] </li></ul><ul><li>class XTableTemplateItem : XTemplateItem </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul>
  20. 20. Плагины <ul><li>Type FindTypeByName(string a_Name) </li></ul><ul><li>{ </li></ul><ul><li>foreach (Type type in GetType().Assembly.GetTypes()) </li></ul><ul><li>{ </li></ul><ul><li>if (!type.IsSubclassOf(typeof(XTemplateItem))) </li></ul><ul><li>{ </li></ul><ul><li>continue; </li></ul><ul><li>} </li></ul><ul><li>if (!type.IsDefined(typeof(TemplateItemAttribute), false)) </li></ul><ul><li>{ </li></ul><ul><li>continue; </li></ul><ul><li>} </li></ul><ul><li>TemplateItemAttribute attr = (TemplateItemAttribute)type.GetCustomAttributes(typeof(TemplateItemAttribute), false)[0]; </li></ul><ul><li>if (attr.TemplateKind == m_Template.TemplateKind && attr.Name == a_Name) </li></ul><ul><li>{ </li></ul><ul><li>return type; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>return null; </li></ul><ul><li>} </li></ul>
  21. 21. Template Method ( шаблонный метод) <ul><li>abstract class Game </li></ul><ul><li>{ </li></ul><ul><li>protected int playersCount; </li></ul><ul><li>protected abstract void initializeGame(); </li></ul><ul><li>protected abstract void makePlay(int player); </li></ul><ul><li>protected abstract bool endOfGame(); </li></ul><ul><li>protected abstract void printWinner(); </li></ul><ul><li>/* A template method : */ </li></ul><ul><li>public void playOneGame(int playersCount) { </li></ul><ul><li>this.playersCount = playersCount; </li></ul><ul><li>initializeGame(); </li></ul><ul><li>int j = 0; </li></ul><ul><li>while (!endOfGame()) { </li></ul><ul><li>makePlay(j); </li></ul><ul><li>j = (j + 1) % playersCount; </li></ul><ul><li>} </li></ul><ul><li>printWinner(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  22. 22. Template Method ( шаблонный метод) <ul><li>abstract public class XParser </li></ul><ul><li>{ </li></ul><ul><li>public XCallInformation ParseAndProcess(XBillingString a_BillingString) </li></ul><ul><li>{ </li></ul><ul><ul><li>a_BillingString.SetParser(this); </li></ul></ul><ul><ul><li>XCallInformation result = DoParse(a_BillingString); </li></ul></ul><ul><ul><li>if (result == null) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>XBilling.RegisterError(a_BillingString); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>return result; </li></ul></ul><ul><li>} </li></ul><ul><li>public XCallInformation Parse(XBillingString a_BillingString) </li></ul><ul><li>{ </li></ul><ul><ul><li>a_BillingString.SetParser(this); </li></ul></ul><ul><ul><li>return DoParse(a_BillingString); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  23. 23. Strategy ( стратегия) <ul><li>class XDocumentConflictManager </li></ul><ul><li>{ </li></ul><ul><li>public XDocumentConflict FindConflict( </li></ul><ul><li>XDocument a_Document, bool a_ForRegisteration) </li></ul><ul><li>{ </li></ul><ul><li>XDocumentConflictFindingStrategy strategy = XDocumentConflictFindingStrategy.Create(a_Document, a_ForRegisteration); </li></ul><ul><li>return new XDocumentConflict( </li></ul><ul><li>a_Document, </li></ul><ul><li>strategy.FindSameDocuments(), </li></ul><ul><li>strategy); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  24. 24. Strategy ( стратегия) <ul><li>public abstract class XDocumentConflictFindingStrategy </li></ul><ul><li>{ </li></ul><ul><li>XDocument m_Document; </li></ul><ul><li>protected XDocumentConflictFindingStrategy(XDocument a_Document) </li></ul><ul><li>{ </li></ul><ul><li>m_Document = a_Document; </li></ul><ul><li>} </li></ul><ul><li>public static XDocumentConflictFindingStrategy Create(XDocument a_Document, bool a_ForRegistration) </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>public IList<XDocument> FindSameDocuments() </li></ul><ul><li>{ </li></ul><ul><li>return XDocumentRepository.Instance.Find(GetSameDocumentsFilter()); </li></ul><ul><li>} </li></ul><ul><li>protected abstract IFilter GetSameDocumentsFilter(); </li></ul><ul><li>public abstract string GetConflictDefinition(); </li></ul><ul><li>} </li></ul>
  25. 25. Strategy ( стратегия) <ul><li>public class XBillingConflictFindingStrategy : XDocumentConflictFindingStrategy </li></ul><ul><li>{ </li></ul><ul><li>internal XBillingConflictFindingStrategy(XDocument a_Document) </li></ul><ul><li>: base(a_Document) </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>protected override IFilter GetSameDocumentsFilter() </li></ul><ul><li>{ </li></ul><ul><li>return new XAndFilter( </li></ul><ul><li>DB.vDocuments.idFilter(&quot;!=&quot;, Document.Id), </li></ul><ul><li>DB.vDocuments.id_CompanyFilter(Document.Company.Id), </li></ul><ul><li>DB.vDocuments.DocumentDateFilter(Document.DocumentDate), </li></ul><ul><li>DB.vDocuments.id_TemplateFilter(Document.Template.Id) </li></ul><ul><li>); </li></ul><ul><li>} </li></ul><ul><li>public override string GetConflictDefinition() </li></ul><ul><li>{ </li></ul><ul><li>return string.Format(&quot;Компания «{0}» уже имеет расшифровку «{1}» за «{2:MMMM yyyy}».&quot;, </li></ul><ul><li>Document.Company.Alias, Document.Template.Name, Document.DocumentDate); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×