Паттерны проектирования улучшение модифицируемости решения Паттерн – это описание задачи и её типового     решения Состо...
Паттерны проектирования достоинства Паттерны описывают часто возникающую проблему, и дают решение, которое может     испо...
Паттерны проектирования Создание объектов Описывают способы как можно создавать объекты в программе. Борется с основным ...
Паттерны проектированияСоздание объектов/Abstract Factory       Описание задачи        Требуется иметь интерфейс для созд...
Паттерны проектирования Создание объектов/Abstract Factory AbstractFactory - абстрактная фабрика:     объявляет интерфейс...
Паттерны проектированияСоздание объектов/Abstract Factory                                                         Так это ...
Паттерны проектирования Создание объектов/Abstract Factoryinterface MazeFactory {            Maze CreateMaze (MazeFactory ...
Паттерны проектированиясоздание объектов/ builder       Описание задачи        Необходимо конструировать сложные        о...
Паттерны проектированиясоздание объектов/ builderПаттерн реализует конвейер9                            МАИ, каф 806, ППС
Паттерны проектирования    создание объектов/ builder / примерinterface MazeBuilder                                Maze Cr...
Паттерны проектированияcоздание объектов / Factory Method        Описание задачи         Внутри метода класса нам нужно  ...
Паттерны проектирования cоздание объектов / Factory Method Две основных разновидности паттерна.    Во-первых, это случай...
Паттерны проектирования cоздание объектов / Factory Method / Примерpackage j2ee.architect.FactoryMethod;                 p...
Паттерны проектирования.создание объектов/ Prototype        Описание задачи         Необходимо создавать объект «по      ...
Паттерны проектирования. создание объектов/ Prototype Варианты реализации    использование диспетчера прототипов.    ре...
Паттерны проектирования.создание объектов/ PrototypeКлонирование человека запрещено! С программными объектами – все проще....
Паттерны проектирования    создание объектов / Prototype /Примерpublic class PrototypePattern {                           ...
Паттерны проектированиясоздание объектов/ Singleton        Описание задачи         В программе существуют глобальные     ...
Паттерны проектирования создание объектов/ Singleton Преимущества    контролируемый доступ к единственному экземпляру.  ...
Паттерны проектированиясоздание объектов/ SingletonДолжен остаться только один!20                             МАИ, каф 806...
Паттерны проектирования    создание объектов / Singleton /Примерpublic class SingletonPattern {                           ...
Паттерны проектирования Структурные патерны Предназначены для организации сложных структур объектов. Помогают упростить ...
Паттерны проектирования. Структурные паттерны Adapter         Описание задачи          Существует необходимость         ...
Паттерны проектирования. Структурные паттерныадаптерС одной стороны 220 вольт, а с другой – столько сколько нужно!24      ...
Паттерны проектирования    структурные паттерны/ Adapter / примерpublic class AdapterPattern {                          pu...
Паттерны проектирования. Структурные паттерны Bridge         Описание задачи          При проектировании системы        ...
Паттерны проектирования    структурные паттерны/ Bridge/ примерpublic class BridgePattern {                               ...
Паттерны проектирования. Структурные паттерны Composite         Описание задачи          При работе с иерархичными      ...
Паттерны проектирования. Структурные паттерны CompositeОднотипно работаем с простыми и сложными объектами! 29             ...
Паттерны проектирования структурные паттерны/ Composite/ пример [1/2]public class CompositePattern {                      ...
Паттерны проектирования    структурные паттерны/ Composite/ пример [2/2]public abstract class Component {                 ...
Паттерны проектирования. Структурные паттерны Decorator         Описание задачи          Иногда появляется необходимость...
Паттерны проектирования    структурные паттерны/ Decorator/ примерpublic class DecoratorPattern {                         ...
Паттерны проектирования. Структурные паттерны Facade         Описание задачи          Система имеет сложную внутреннюю  ...
Паттерны проектирования    структурные паттерны/ Façade / примерpublic class FacadePattern {                              ...
Паттерны проектирования.cтруктурные паттерны/ Flyweight        Описание задачи         В системе есть большое число      ...
Паттерны проектирования. cтруктурные паттерны/ Flyweight Применяйте этот паттерн, когда выполнены все нижеперечисленные у...
Паттерны проектирования    структурные паттерны/ Flyweight / примерpublic class FlyweightPattern {                       p...
Паттерны проектирования    структурные паттерны/ Flyweight / примерimport java.util.*;public class FlyweightFactory {    p...
Паттерны проектированияcтруктурные паттерны/ proxy        Описание задачи         Есть необходимость при выполнении      ...
Паттерны проектирования cтруктурные паттерны/ proxy удаленный заместитель      предоставляет локального представителя вме...
Паттерны проектирования    структурные паттерны/ Proxy / примерpublic class ProxyPattern {                                ...
Upcoming SlideShare
Loading in …5
×

Проектирование программных систем. Занятие 9

694 views
615 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
694
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
35
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Проектирование программных систем. Занятие 9

  1. 1. Паттерны проектирования улучшение модифицируемости решения Паттерн – это описание задачи и её типового решения Состоит:  Имя  Постановка задачи  Описание решения  Описания когда данный паттерн необходимо применять  Примера 1 МАИ, каф 806, ППС
  2. 2. Паттерны проектирования достоинства Паттерны описывают часто возникающую проблему, и дают решение, которое может использоваться многократно. Они помогают:  Быстро сфокусироваться на решении проблемы, как только вы распознали нужный паттерн.  Изучение паттернов помогает придти к новым идеям.  Предоставить единый язык для дискуссий.  Предоставить решение проблем из реального мира.  Объяснить причину, по которой выбирается решение.  Многократно использовать опыт предыдущих поколений дизайнеров систем. Но:  Паттерны не содержат ответы на все вопросы и решения всех задач!  Неправильно идентифицированный и примененный паттерн доставит больше неприятности, чем пользы. 2 МАИ, каф 806, ППС
  3. 3. Паттерны проектирования Создание объектов Описывают способы как можно создавать объекты в программе. Борется с основным видом зависимости между модулями – знанием о существовании модуля и месте расположения. Самое серьезное препятствие лежит в жестко зашитой в код информации о том, какие классы инстанцируются. С помощью порождающих паттернов можно различными способами избавиться от явных ссылок на конкретные классы из кода. Паттерны:  Abstract Factory  Builder  Factory Method  Prototype  Singleton 3 МАИ, каф 806, ППС
  4. 4. Паттерны проектированияСоздание объектов/Abstract Factory  Описание задачи Требуется иметь интерфейс для создания серии однотипных объектов.  Описание решения Создание отдельного класса отвечающего за создание экземпляров объектов.  Когда применять Можно выделить группы схожих объектов. Т.е. в одном случае мы создаем один набор объектов (одной фабрикой) в другом случае другой набор объектов (другой фабрикой)  Пример Интерфейс пользователя с набором «скинов». Т.е. набор различных по отображению интерфейсов но с одинаковой функциональностью. Доступ к базе данных (когда для разных СУБД есть разные объекты доступа)4 МАИ, каф 806, ППС
  5. 5. Паттерны проектирования Создание объектов/Abstract Factory AbstractFactory - абстрактная фабрика: объявляет интерфейс для операций, создающих абстрактные объекты-продукты; ConcreteFactory - конкретная фабрика: реализует операции, создающие конкретные объекты-продукты; AbstractProduct - абстрактный продукт: объявляет интерфейс для типа объекта-продукта; ConcreteProduct - конкретный продукт: определяет объект-продукт, создаваемый соответствующей конкретной фабрикой и реализует интерфейс Abstract Product; Client - клиент: пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct. 5 МАИ, каф 806, ППС
  6. 6. Паттерны проектированияСоздание объектов/Abstract Factory Так это выглядит в жизни6 МАИ, каф 806, ППС
  7. 7. Паттерны проектирования Создание объектов/Abstract Factoryinterface MazeFactory { Maze CreateMaze (MazeFactory factory)Maze MakeMaze(); {Wall MakeWall(); Maze aMaze = factory.MakeMaze();Room MakeRoom(int n); Room rl = factory.MakeRoom(l);Door MakeDoor(Room rl, Room r2); Room r2 = factory.MakeRoom(2);}; Door aDoor = factory.MakeDoor(rl, r2); aMaze.AddRoom(rl) ; aMaze.AddRoom(r2); rl.SetSide(North, factory.MakeWall()); rl.SetSide(East, aDoor); rl.SetSide(South, factory.MakeWall() ) ; rl.SetSide(West, factory.MakeWall()); r2.SetSide(North, factory.MakeWall()); r2.SetSide(East, factory.MakeWall()); r2.SetSide(South, factory.MakeWall()); r2.SetSide(West, aDoor); return aMaze; } 7 МАИ, каф 806, ППС
  8. 8. Паттерны проектированиясоздание объектов/ builder  Описание задачи Необходимо конструировать сложные объекты. При этом объекты со схожей конструкцией могут создаваться из разных объектов.  Описание решения Выделяется специальный объект, реализующий алгоритм создания сложного объекта. Создаются объекты, для создания частей составного объекта.  Когда применять Когда есть набор сложных объектов, состоящих из однотипных частей и имеющих схожий алгоритм создания.  Пример Преобразование форматов, когда нужно применить последовательно серию преобразований. Например при переводе текста из одного формата в другой мы последовательно применяем наборы преобразований параграфов, слов, шрифтов …8 МАИ, каф 806, ППС
  9. 9. Паттерны проектированиясоздание объектов/ builderПаттерн реализует конвейер9 МАИ, каф 806, ППС
  10. 10. Паттерны проектирования создание объектов/ builder / примерinterface MazeBuilder Maze CreateMaze (MazeBuilder builder){ { void BuildMaze(); builder.BuildMaze(); void BuildRoom(int room); builder.BuiIdRoom(l); void BuildDoor(int roomFrom, int roomTo); builder.BuiIdRoom(2) ; Maze GetMaze(); builder.BuildDoor(1, 2);}; return builder.GetMaze(); } 10 МАИ, каф 806, ППС
  11. 11. Паттерны проектированияcоздание объектов / Factory Method  Описание задачи Внутри метода класса нам нужно создавать экземпляр другого класса. При этом в наследниках, нам возможно понадобится создавать другие классы.  Описание решения Конструктор класса вызывается в специальном методе, который может быть переопределен в наследнике.  Когда применять Хорошо все вызовы new оформлять в виде отдельных методов, где это возможно.  Пример Приложение может использовать различные библиотеки для доступа к базе данных. Создание экземпляра объекта-библиотеки может определяться конфигурацией.11 МАИ, каф 806, ППС
  12. 12. Паттерны проектирования cоздание объектов / Factory Method Две основных разновидности паттерна.  Во-первых, это случай, когда класс Сгeatorявляется абстрактным и не содержит реализации объявленного в нем фабричного метода.  Вторая возможность: Creator – конкретный класс, в котором по умолчанию есть реализация фабричного метода. Редко, но встречается и абстрактный класс, имеющий реализацию по умолчанию; Параметризованные фабричные методы. Это еще один вариант паттерна, который позволяет фабричному методу создавать разные виды продуктов. Фабричному методу передается параметр, который идентифицирует вид создаваемого объекта. Все объекты, получающиеся с помощью фабричного метода, разделяют общий интерфейс Product.. 12 МАИ, каф 806, ППС
  13. 13. Паттерны проектирования cоздание объектов / Factory Method / Примерpackage j2ee.architect.FactoryMethod; public class ConcreteCreator implements CreatorIF { public class FactoryMethodPattern { public TradeIF factoryMethod() { public static void main(String[] args) { return new ConcreteTrade(); // Create creator, which uses the } FactoryMethod } CreatorIF creator = new ConcreteCreator(); // Create trade via factory method TradeIF trade = creator.factoryMethod(); public class ConcreteTrade implements TradeIF { // Call trade action method public void action() { trade.action(); System.out.println("ConcreteTrade.action() called."); System.out.println(); } } } } public interface CreatorIF { public abstract TradeIF factoryMethod(); } public interface TradeIF { public void action(); } 13 МАИ, каф 806, ППС
  14. 14. Паттерны проектирования.создание объектов/ Prototype  Описание задачи Необходимо создавать объект «по образцу».  Описание решения У объектов, требующих копирование создается метод Clone дублирующий объект.  Когда применять Много объектов требующих создание по образцу или жесткие требования к модифицируемости программы.  Пример Графический редактор, где на палитре «инструментов» размещаются объекты. При помещении из в рабочее поле создаются копии объектов с палитры.14 МАИ, каф 806, ППС
  15. 15. Паттерны проектирования. создание объектов/ Prototype Варианты реализации  использование диспетчера прототипов.  реализация операции Clone. Преимущества  добавление и удаление продуктов во время выполнения.  спецификация новых объектов путем изменения значений. Недостатки  Основной недостаток паттерна прототип заключается в том, что каждый подкласс класса Prototype должен реализовывать операцию Clone, а это далеко не всегда просто. Например, сложно добавить операцию Clone, когда рассматриваемые классы уже существуют.  Проблемы возникают и в случае, если во внутреннем представлении объекта есть другие объекты или наличествуют круговые ссылки 15 МАИ, каф 806, ППС
  16. 16. Паттерны проектирования.создание объектов/ PrototypeКлонирование человека запрещено! С программными объектами – все проще.16 МАИ, каф 806, ППС
  17. 17. Паттерны проектирования создание объектов / Prototype /Примерpublic class PrototypePattern { public class ConcretePrototype1 implements PrototypeIF { public static void main(String[] args) { public ConcretePrototype1() { System.out.println("ConcretePrototype1 constructed."); } public PrototypeIF getClone() { // Create prototypes return new ConcretePrototype1(); System.out.println("Constructing prototypes."); } PrototypeIF prototype1 = new ConcretePrototype1(); public void action() { PrototypeIF prototype2 = new ConcretePrototype2(); System.out.println("ConcretePrototype1.action() called"); // Get clones from prototypes } System.out.println("Constructing clones from }prototypes."); PrototypeIF clone1 = prototype1.getClone(); public class ConcretePrototype2 implements PrototypeIF { PrototypeIF clone2 = prototype2.getClone(); public ConcretePrototype2() { System.out.println("ConcretePrototype2 constructed."); // Call actions on the clones } System.out.println("Calling actions on the clones."); public PrototypeIF getClone() { clone1.action(); return new ConcretePrototype1(); clone2.action(); } System.out.println(); public void action() { } System.out.println("ConcretePrototype2.action()} called."); } } public interface PrototypeIF { public PrototypeIF getClone(); public void action(); } 17 МАИ, каф 806, ППС
  18. 18. Паттерны проектированиясоздание объектов/ Singleton  Описание задачи В программе существуют глобальные объекты с одним экземпляром на всю программу.  Описание решения Класс объекта хранит ссылку на сам объект и может инициировать создание объекта как при первом обращении так и при старте программы.  Когда применять Всегда когда нужно хранить глобальные свойства системы или иметь доступ к глобальному ресурсу (если он может существовать только в одном экземпляре)  Пример Например, при отправке сообщений в очередь мы хотим убедится что у нас не будет конфликтов из-за многопоточности. Поэтому мы создаем один объект по работе с данной очередью и вставляем в нем мониторы.18 МАИ, каф 806, ППС
  19. 19. Паттерны проектирования создание объектов/ Singleton Преимущества  контролируемый доступ к единственному экземпляру.  уменьшение числа имен, используемых в системе.  допускает уточнение операций и представления.  допускает переменное число экземпляров.  большая гибкость, чем у операций класса. Реализация  гарантирование единственного экземпляра.  порождение подклассов Singleton (при необходимости). 19 МАИ, каф 806, ППС
  20. 20. Паттерны проектированиясоздание объектов/ SingletonДолжен остаться только один!20 МАИ, каф 806, ППС
  21. 21. Паттерны проектирования создание объектов / Singleton /Примерpublic class SingletonPattern { public final class Singleton { public static void main(String[] args) { private static Singleton instance; private int value; Singleton s1 = Singleton.getInstance(); private Singleton() System.out.println("s1.getInfo()="+ s1.getInfo()); { Singleton s2 = Singleton.getInstance(); System.out.println("Singleton constructed."); System.out.println("s2.getInfo()="+s2.getInfo()); } System.out.println("s1.setValue(42)"); public static synchronized Singleton getInstance() s1.setValue(42); { if (instance == null) System.out.println("s1.getValue()="+s1.getValue()); instance = new Singleton(); System.out.println("s2.getValue()="+s2.getValue()); return instance; System.out.println("s1.equals(s2)="+s1.equals(s2) } + ", s2.equals(s1)="+s2.equals(s1)); public String getInfo() { System.out.println(); return getClass().getName() + } // Uncomment line below to also see the loader} //+", loaded by " + getClass().getClassLoader(); ", id#" + System.identityHashCode(this); } public int getValue() {return value;} public void setValue(int parm) {value = parm;} public boolean equals(Singleton parm) { return (System.identityHashCode(this) == System.identityHashCode(parm)); } } 21 МАИ, каф 806, ППС
  22. 22. Паттерны проектирования Структурные патерны Предназначены для организации сложных структур объектов. Помогают упростить работу со сложными структурами. Включают:  Adapter  Bridge  Composite  Decorator  Facade  Flyweight  Proxy 22 МАИ, каф 806, ППС
  23. 23. Паттерны проектирования. Структурные паттерны Adapter  Описание задачи Существует необходимость использовать для решения задачи класс с отличной от изначально спроектированной структуры.  Описание решения Создается специальный адаптер для конвертации интерфейсов.  Когда применять Когда проще сделать адаптер, чем переписать остальную систему на использование нового интерфейса.  Пример Для доступа к БД использовался механизм ODBC, но понадобилось использовать новую БД для которой есть только ADO интерфейс. 23 МАИ, каф 806, ППС
  24. 24. Паттерны проектирования. Структурные паттерныадаптерС одной стороны 220 вольт, а с другой – столько сколько нужно!24 МАИ, каф 806, ППС
  25. 25. Паттерны проектирования структурные паттерны/ Adapter / примерpublic class AdapterPattern { public class AdapterByClass extends Adaptee implements TargetIF { public static void main(String[] args) { public AdapterByClass() {// Create targets. System.out.println("AdapterByClass constructed."); System.out.println("Creating targets."); } TargetIF target1 = new AdapterByClass(); public String newRequest() { TargetIF target2 = new AdapterByObject(); return oldRequest(); // Call target requests } System.out.println("Calling targets."); } System.out.println("target1.newRequest()->"+target1.newRequest()); public class AdapterByObject implements TargetIF { System.out.println("target2.newRequest()- private Adaptee adaptee;>"+target2.newRequest()); public AdapterByObject() { System.out.println(); System.out.println("AdapterByObject constructed."); } }} public String newRequest() { // Create an Adaptee object if it doesn’t exist yetpublic class Adaptee { if (adaptee == null) { adaptee = new Adaptee(); } public Adaptee() { return adaptee.oldRequest(); System.out.println("Adaptee constructed."); } } } public String oldRequest() { public interface TargetIF { return "Adaptee.oldRequest() called."; public String newRequest(); } }} 25 МАИ, каф 806, ППС
  26. 26. Паттерны проектирования. Структурные паттерны Bridge  Описание задачи При проектировании системы интерфейсы строятся исходя из терминов предметной области (абстракции), однако реализация не всегда близка к предметной области. Нужен механизм который позволяет связать абстракцию и реализацию.  Описание решения Создается класс Abstraction с описанием сценария работы с конкретной реализацией абстракции.  Когда применять Абстракция и реализация может развиваться независимо (например, в различных случаях может использоваться различная реализация)  Пример При проектировании БД в интерфейсе была определена одна сущность, но при реализации она распалась на три таблицы в БД. 26 МАИ, каф 806, ППС
  27. 27. Паттерны проектирования структурные паттерны/ Bridge/ примерpublic class BridgePattern { public interface AbstractionIF { public static void main(String[] args) { public void action();System.out.println("Constructing SportsCar and }EconomyCar."); public interface ImplementorIF { AbstractionIF car1 = new SportsCar (); public void actionImplemented(); AbstractionIF car2 = new EconomyCar(); } car1.action(); car2.action(); public class SportsCar implements AbstractionIF {} ImplementorIF implementor = new SportsCarImplementor();} public void action() {public class SportsCarImplementor implements implementor.actionImplemented();ImplementorIF { }public void actionImplemented() }{System.out.println("SportsCarImplementor.actionImplemented() called."); public class EconomyCar implements AbstractionIF { } ImplementorIF implementor = new} EconomyCarImplementor();public class EconomyCarImplementor implements public void action() {ImplementorIF { implementor.actionImplemented();public void actionImplemented() { }System.out.println("EconomyCarImplementor.actionImplemented() called."); } }} 27 МАИ, каф 806, ППС
  28. 28. Паттерны проектирования. Структурные паттерны Composite  Описание задачи При работе с иерархичными объектами часто нужно иметь возможность работать с ними вне зависимости составной это объект или простой.  Описание решения У всех объектов в иерархии выделяются как общие интерфейсы так и характерные только для сложных объектов.  Когда применять Всегда при работе с динамическими структурами данных.  Пример При реализации текстового редактора нужно с помощью одинакового интерфейса (operation) уметь отрисовывать как сложные объекты (параграфы), так и простые (буквы). 28 МАИ, каф 806, ППС
  29. 29. Паттерны проектирования. Структурные паттерны CompositeОднотипно работаем с простыми и сложными объектами! 29 МАИ, каф 806, ППС
  30. 30. Паттерны проектирования структурные паттерны/ Composite/ пример [1/2]public class CompositePattern { System.out.println("Displaying trunk composition:"); public static void main(String[] args) { trunk.display();// Create leaves // Remove branch1 and branch2 from trunk Component leaf1 = new Leaf(" leaf#1"); trunk.remove(branch1); Component leaf2 = new Leaf(" leaf#2"); trunk.remove(branch2); Component leaf3 = new Leaf(" leaf#3"); // Show trunk composition now // Create branches System.out.println("Displaying trunk composition now:"); Component branch1 = new Composite(" branch1"); trunk.display(); Component branch2 = new Composite(" branch2"); System.out.println(); // Create trunk } Component trunk = new Composite("trunk"); } // Add leaf1 and leaf2 to branch1 branch1.add(leaf1); branch1.add(leaf2); // Add branch1 to trunk trunk.add(branch1); // Add leaf3 to branch2 branch2.add(leaf3); // Add branch2 to trunk trunk.add(branch2); // Show trunk composition 30 МАИ, каф 806, ППС
  31. 31. Паттерны проектирования структурные паттерны/ Composite/ пример [2/2]public abstract class Component { import java.util.*; public abstract void display(); public class Composite extends Component { public void add(Component c) {} String name = null; public void remove(Component c) } List children = new ArrayList(); public Component getChild(int index) { return null; } public Composite(String parm) { this.name = parm;} public String getName() { return null; } public String getName() { return name; }} public Component getChild(int parm) { Component child; try {child = (Component) children.get(parm);}package j2ee.architect.Composite; catch (IndexOutOfBoundsException ioobe) {child = null;}public class Leaf extends Component { return child; } private String name; public void add(Component parm) {children.add(parm);} public Leaf(String parm) { public void remove(Component parm) { this.name = parm; try { System.out.println(parm.trim()+" constructed."); children.remove(parm);} catch (Exception e) {} } } public void display() { public void display() { System.out.println(this.getName()); Iterator iterator = children.iterator(); } System.out.println(this.getName() public String getName() { +(iterator.hasNext()?" with the following: ":" that is bare.")); return name; while (iterator.hasNext()) {((Component) } iterator.next()).display();}} } } 31 МАИ, каф 806, ППС
  32. 32. Паттерны проектирования. Структурные паттерны Decorator  Описание задачи Иногда появляется необходимость менять свойства объектов не на стадии проектирования, а на стадии выполнения.  Описание решения Создается класс-декоратор, который добавляет новые свойства к объекту данного класса и модифицирует существующие (сохраняя интерфейс старого класса)  Когда применять Если существует много способов для реализации одного и того же действия (в зависимости от разных условий).  Пример Работа с потоками ввода-вывода в Java. 32 МАИ, каф 806, ППС
  33. 33. Паттерны проектирования структурные паттерны/ Decorator/ примерpublic class DecoratorPattern { public class ConcreteDecoratorA extends Decorator { public static void main(String[] args) { String addedVariable;// Create object decorated with A public void action() { System.out.println("Creating component decorated with super.action();A."); addedVariable = "extra"; ComponentIF decorated1 = new ConcreteDecoratorA(); System.out.println("ConcreteDecoratorA.addedVariable="+ad decorated1.action(); dedVariable); // Create object decorated with B } ComponentIF decorated2 = new ConcreteDecoratorB(); } // Call action on object decorated with B public class ConcreteDecoratorB extends Decorator { System.out.println("Calling action() on component public void action() {decorated with B."); super.action(); decorated2.action(); addedMethod(); System.out.println(); } } private void addedMethod() {} System.out.println("ConcreteDecoratorB.addedMethod() called.");public class ConcreteComponent implements ComponentIF { } public void action() { } System.out.println("ConcreteComponent.action() public class Decorator implements ComponentIF {called."); ComponentIF component = new ConcreteComponent(); } public void action() {} component.action(); } } 33 МАИ, каф 806, ППС
  34. 34. Паттерны проектирования. Структурные паттерны Facade  Описание задачи Система имеет сложную внутреннюю структуру, которая часто меняется. При этом внешняя система должна иметь возможность использовать функционал нашей системы.  Описание решения Создается класс-фасад, который скрывает внутреннее устройство системы.  Когда применять Всегда. Если необходимо предоставить интерфейсы внешней системе.  Пример При реализации программы- калькулятора для каждой математической функции пишется отдельный класс, но для пользовательского интерфейса делается один фасад. 34 МАИ, каф 806, ППС
  35. 35. Паттерны проектирования структурные паттерны/ Façade / примерpublic class FacadePattern { public class SubSystem1 { public static void main(String[] args) { public void getCustomer() {// Construct and call Façade System.out.println("SubSystem1.getCustomer() called.");} System.out.println("Constructing facade."); public void getSecurity() { Façade façade = new Façade(); System.out.println("SubSystem1.getSecurity() called.");} System.out.println("Calling facade.processOrder()."); public void priceTransaction() { façade.processOrder(); System.out.println("SubSystem1.priceTransaction() called.");} System.out.println(); } }} public class SubSystemN {public class Façade { public void checkBalances() { public void processOrder() { System.out.println("SubSystemN.checkBalances() SubSystem1 subsys1 = new SubSystem1(); called.");} subsys1.getCustomer(); public void completeOrder() { subsys1.getSecurity(); System.out.println("SubSystemN.completeOrder() subsys1.priceTransaction(); called.");} SubSystemN subsysN = new SubSystemN(); } subsysN.checkBalances(); subsysN.completeOrder(); }} 35 МАИ, каф 806, ППС
  36. 36. Паттерны проектирования.cтруктурные паттерны/ Flyweight  Описание задачи В системе есть большое число объектов у которых можно выделить общие свойства с общими значениями.  Описание решения Общие свойства выделяются в отдельный объект, который передается всем объектам в операциях, использующих данное свойство.  Когда применять В системе большое число объектов и стоимость хранения объектов достаточно большая (из-за числа или размера).  Пример При реализации графического редактора контекст отображения – общее свойство, которое может быть вынесено наружу.36 МАИ, каф 806, ППС
  37. 37. Паттерны проектирования. cтруктурные паттерны/ Flyweight Применяйте этот паттерн, когда выполнены все нижеперечисленные условия:  в приложении используется большое число объектов;  из-за этого накладные расходы на хранение высоки;  большую часть состояния объектов можно вынести вовне;  многие группы объектов можно заменить относительно небольшим количеством разделяемых объектов, поскольку внешнее состояние вынесено;  приложение не зависит от идентичности объекта. Поскольку flyweight могут разделяться, то проверка на идентичность возвратит «истину≫ для концептуально различных объектов; 37 МАИ, каф 806, ППС
  38. 38. Паттерны проектирования структурные паттерны/ Flyweight / примерpublic class FlyweightPattern { public class ConcreteFlyweight implements FlyweightIF { public static void main(String[] args) { private boolean state;// Create states public ConcreteFlyweight(State parm) { State stateF = new State(false); this.state = parm.getState(); State stateT = new State(true); } // Get reference to (and in doing so create) public void action(State parm) {flyweight System.out.println("ConcreteFlyweight.action(" FlyweightIF myfwkey1 = +parm.getState()+") called.");FlyweightFactory.getFlyweight("myfwkey"); this.state = parm.getState(); // Get new reference to the same flyweight System.out.println("ConcreteFlyweight.state = " FlyweightIF myfwkey2 =FlyweightFactory.getFlyweight("myfwkey"); + this.state); // Call action on both references } System.out.println("Call flyweight action with }state=false"); public interface FlyweightIF { myfwkey1.action(stateF); // method to receive and act on extrinsic state. System.out.println("Call flyweight action with public void action(State parm);state=true"); } myfwkey2.action(stateT); public class State { System.out.println(); private boolean state; } public State(boolean parm) {this.state = parm;}} public boolean getState() {return state;} } 38 МАИ, каф 806, ППС
  39. 39. Паттерны проектирования структурные паттерны/ Flyweight / примерimport java.util.*;public class FlyweightFactory { private static Map map = new HashMap(); public static FlyweightIF getFlyweight(String parm) { // Return the Flyweight if it exists, // or create it if it doesn’t. FlyweightIF flyweight = null; try { if (map.containsKey(parm)) { // Return existing flyweight flyweight = (FlyweightIF) map.get(parm); } else { // Create flyweight with a ‘true’ state flyweight = new ConcreteFlyweight(new State(true)); map.put(parm, flyweight); System.out.println("Created flyweight "+parm+" with state=true"); System.out.println(""); } } catch (ClassCastException cce) { System.out.println(cce.getMessage()); } return flyweight; }} 39 МАИ, каф 806, ППС
  40. 40. Паттерны проектированияcтруктурные паттерны/ proxy  Описание задачи Есть необходимость при выполнении действий над объектами проводить дополнительные процедуры (какие именно определяется только в процессе выполнения).  Описание решения Делается объект-обертка с такими же интерфейсами.  Когда применять Работа в разных адресных пространствах (Remoting), динамическое создание объектов, динамический подсчет ссылок на объекты и т.д.  Пример Мониторинг вызовов к методам объекта. К каждому методу добавляется код с трассировками.40 МАИ, каф 806, ППС
  41. 41. Паттерны проектирования cтруктурные паттерны/ proxy удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве; виртуальный заместитель создает ≪тяжелые≫ объекты по требованию; защищающий заместитель контролирует доступ к исходному объекту. Такие заместители полезны, когда для разных объектов определены различные права доступа. ≪умная≫ ссылка это замена обычного указателя. Она позволяет выполнить дополнительные действия при доступе к объекту. К типичным применениям такой ссылки можно отнести:  подсчет числа ссылок на реальный объект, с тем чтобы занимаемую им память можно было освободить автоматически, когда не останется ни одной ссылки;  загрузку объекта в память при первом обращении к нему;  проверку и установку блокировки на реальный объект при обращении к нему, чтобы никакой другой объект не смог в это время изменить его. 41 МАИ, каф 806, ППС
  42. 42. Паттерны проектирования структурные паттерны/ Proxy / примерpublic class ProxyPattern { public class Service implements ServiceIF { public static void main(String[] args) { // Service to be proxied// Create service proxy (instantiates service too) public Service() { System.out.println("Creating proxy to service."); System.out.println("Service constructed."); ServiceIF proxy = new Proxy(); } // Call action method on service via proxy public void action() { System.out.println("Calling action method on System.out.println("Service.action() called.");proxy."); } proxy.action(); } System.out.println(); } public interface ServiceIF {} // Interface for Service and Proxy public void action();public class Proxy implements ServiceIF { } // Proxy to be the service private Service service = new Service(); public void action() { service.action(); }} 42 МАИ, каф 806, ППС

×