Паттерны проектирования
 улучшение модифицируемости решения


 Паттерн – это описание задачи и её типового
     решения
 Состоит:
    Имя
    Постановка задачи
    Описание решения
    Описания когда данный паттерн
          необходимо применять
         Примера




 1                                              МАИ, каф 806, ППС
Паттерны проектирования
 достоинства


 Паттерны описывают часто возникающую проблему, и дают решение, которое может
     использоваться многократно.
 Они помогают:
    Быстро сфокусироваться на решении проблемы, как только вы распознали нужный
          паттерн.
         Изучение паттернов помогает придти к новым идеям.
         Предоставить единый язык для дискуссий.
         Предоставить решение проблем из реального мира.
         Объяснить причину, по которой выбирается решение.
         Многократно использовать опыт предыдущих поколений дизайнеров систем.
 Но:
         Паттерны не содержат ответы на все вопросы и решения всех задач!
         Неправильно идентифицированный и примененный паттерн доставит больше
          неприятности, чем пользы.




 2                                                          МАИ, каф 806, ППС
Паттерны проектирования
 Создание объектов


 Описывают способы как можно создавать объекты в программе.
 Борется с основным видом зависимости между модулями – знанием о существовании модуля
     и месте расположения.
 Самое серьезное препятствие лежит в жестко зашитой в код информации о том, какие классы
     инстанцируются.
 С помощью порождающих паттернов можно различными способами избавиться от явных
     ссылок на конкретные классы из кода.
 Паттерны:
    Abstract Factory
    Builder
    Factory Method
    Prototype
    Singleton




 3                                                      МАИ, каф 806, ППС
Паттерны проектирования
Создание объектов/Abstract Factory

       Описание задачи
        Требуется иметь интерфейс для создания
        серии однотипных объектов.
       Описание решения
        Создание отдельного класса отвечающего
        за создание экземпляров объектов.
       Когда применять
        Можно выделить группы схожих объектов.
        Т.е. в одном случае мы создаем один
        набор объектов (одной фабрикой) в другом
        случае другой набор объектов (другой
        фабрикой)
       Пример
        Интерфейс пользователя с набором
        «скинов». Т.е. набор различных по
        отображению интерфейсов но с
        одинаковой функциональностью.
        Доступ к базе данных (когда для разных
        СУБД есть разные объекты доступа)




4                                                  МАИ, каф 806, ППС
Паттерны проектирования
 Создание объектов/Abstract Factory


 AbstractFactory - абстрактная фабрика:
     объявляет интерфейс для операций, создающих абстрактные объекты-продукты;
 ConcreteFactory - конкретная фабрика:
     реализует операции, создающие конкретные объекты-продукты;
 AbstractProduct - абстрактный продукт:
     объявляет интерфейс для типа объекта-продукта;
 ConcreteProduct - конкретный продукт:
      определяет объект-продукт, создаваемый соответствующей конкретной фабрикой и
     реализует интерфейс Abstract Product;
 Client - клиент:
     пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и
     AbstractProduct.




 5                                                        МАИ, каф 806, ППС
Паттерны проектирования
Создание объектов/Abstract Factory


                                                         Так это
                                                         выглядит в
                                                         жизни




6                                    МАИ, каф 806, ППС
Паттерны проектирования
 Создание объектов/Abstract Factory

interface 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, ППС
Паттерны проектирования
создание объектов/ builder

       Описание задачи
        Необходимо конструировать сложные
        объекты. При этом объекты со схожей
        конструкцией могут создаваться из
        разных объектов.
       Описание решения
        Выделяется специальный объект,
        реализующий алгоритм создания
        сложного объекта. Создаются объекты,
        для создания частей составного объекта.
       Когда применять
        Когда есть набор сложных объектов,
        состоящих из однотипных частей и
        имеющих схожий алгоритм создания.
       Пример
        Преобразование форматов, когда нужно
        применить последовательно серию
        преобразований. Например при переводе
        текста из одного формата в другой мы
        последовательно применяем наборы
        преобразований параграфов, слов,
        шрифтов …



8                                                 МАИ, каф 806, ППС
Паттерны проектирования
создание объектов/ builder


Паттерн реализует конвейер




9                            МАИ, каф 806, ППС
Паттерны проектирования
    создание объектов/ 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, ППС
Паттерны проектирования
cоздание объектов / Factory Method

        Описание задачи
         Внутри метода класса нам нужно
         создавать экземпляр другого класса.
         При этом в наследниках, нам возможно
         понадобится создавать другие классы.
        Описание решения
         Конструктор класса вызывается в
         специальном методе, который может
         быть переопределен в наследнике.
        Когда применять
         Хорошо все вызовы new оформлять в
         виде отдельных методов, где это
         возможно.
        Пример
         Приложение может использовать
         различные библиотеки для доступа к
         базе данных. Создание экземпляра
         объекта-библиотеки может
         определяться конфигурацией.




11                                              МАИ, каф 806, ППС
Паттерны проектирования
 cоздание объектов / Factory Method


 Две основных разновидности паттерна.
    Во-первых, это случай, когда класс Сгeator'является абстрактным и не содержит
           реализации объявленного в нем фабричного метода.
          Вторая возможность: Creator – конкретный класс, в котором по умолчанию есть
           реализация фабричного метода. Редко, но встречается и абстрактный класс, имеющий
           реализацию по умолчанию;
 Параметризованные фабричные методы.
      Это еще один вариант паттерна, который позволяет фабричному методу создавать разные
      виды продуктов. Фабричному методу передается параметр, который идентифицирует вид
      создаваемого объекта. Все объекты, получающиеся с помощью фабричного метода,
      разделяют общий интерфейс Product..




 12                                                        МАИ, каф 806, ППС
Паттерны проектирования
 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, ППС
Паттерны проектирования.
создание объектов/ Prototype



        Описание задачи
         Необходимо создавать объект «по
         образцу».
        Описание решения
         У объектов, требующих копирование
         создается метод Clone дублирующий
         объект.
        Когда применять
         Много объектов требующих создание по
         образцу или жесткие требования к
         модифицируемости программы.
        Пример
          Графический редактор, где на палитре
         «инструментов» размещаются объекты.
         При помещении из в рабочее поле
         создаются копии объектов с палитры.




14                                               МАИ, каф 806, ППС
Паттерны проектирования.
 создание объектов/ Prototype


 Варианты реализации
    использование диспетчера прототипов.
    реализация операции Clone.
 Преимущества
    добавление и удаление продуктов во время выполнения.
    спецификация новых объектов путем изменения значений.
 Недостатки
    Основной недостаток паттерна прототип заключается в том, что каждый подкласс класса
          Prototype должен реализовывать операцию Clone, а это далеко не всегда просто.
          Например, сложно добавить операцию Clone, когда рассматриваемые классы уже
          существуют.
         Проблемы возникают и в случае, если во внутреннем представлении объекта есть
          другие объекты или наличествуют круговые ссылки




 15                                                        МАИ, каф 806, ППС
Паттерны проектирования.
создание объектов/ Prototype


Клонирование человека запрещено! С программными объектами – все проще.




16                                             МАИ, каф 806, ППС
Паттерны проектирования
    создание объектов / 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, ППС
Паттерны проектирования
создание объектов/ Singleton

        Описание задачи
         В программе существуют глобальные
         объекты с одним экземпляром на всю
         программу.
        Описание решения
         Класс объекта хранит ссылку на сам
         объект и может инициировать
         создание объекта как при первом
         обращении так и при старте
         программы.
        Когда применять
         Всегда когда нужно хранить
         глобальные свойства системы или
         иметь доступ к глобальному ресурсу
         (если он может существовать только
         в одном экземпляре)
        Пример
         Например, при отправке сообщений в
         очередь мы хотим убедится что у нас
         не будет конфликтов из-за
         многопоточности. Поэтому мы
         создаем один объект по работе с
         данной очередью и вставляем в нем
         мониторы.



18                                             МАИ, каф 806, ППС
Паттерны проектирования
 создание объектов/ Singleton


 Преимущества
    контролируемый доступ к единственному экземпляру.
    уменьшение числа имен, используемых в системе.
    допускает уточнение операций и представления.
    допускает переменное число экземпляров.
    большая гибкость, чем у операций класса.
 Реализация
    гарантирование единственного экземпляра.
    порождение подклассов Singleton (при необходимости).




 19                                                   МАИ, каф 806, ППС
Паттерны проектирования
создание объектов/ Singleton


Должен остаться только один!




20                             МАИ, каф 806, ППС
Паттерны проектирования
    создание объектов / 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, ППС
Паттерны проектирования
 Структурные патерны


 Предназначены для организации сложных структур объектов.
 Помогают упростить работу со сложными структурами.
 Включают:
    Adapter
    Bridge
    Composite
    Decorator
    Facade
    Flyweight
    Proxy




 22                                                   МАИ, каф 806, ППС
Паттерны проектирования. Структурные паттерны


 Adapter
         Описание задачи
          Существует необходимость
          использовать для решения задачи
          класс с отличной от изначально
          спроектированной структуры.
         Описание решения
          Создается специальный адаптер для
          конвертации интерфейсов.
         Когда применять
          Когда проще сделать адаптер, чем
          переписать остальную систему на
          использование нового интерфейса.
         Пример
          Для доступа к БД использовался
          механизм ODBC, но понадобилось
          использовать новую БД для которой
          есть только ADO интерфейс.




 23                                           МАИ, каф 806, ППС
Паттерны проектирования. Структурные паттерны
адаптер


С одной стороны 220 вольт, а с другой – столько сколько нужно!




24                                                         МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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 yet
public 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, ППС
Паттерны проектирования. Структурные паттерны


 Bridge
         Описание задачи
          При проектировании системы
          интерфейсы строятся исходя из
          терминов предметной области
          (абстракции), однако реализация не
          всегда близка к предметной области.
          Нужен механизм который позволяет
          связать абстракцию и реализацию.
         Описание решения
          Создается класс Abstraction с
          описанием сценария работы с
          конкретной реализацией абстракции.
         Когда применять
          Абстракция и реализация может
          развиваться независимо (например, в
          различных случаях может
          использоваться различная
          реализация)
         Пример
          При проектировании БД в интерфейсе
          была определена одна сущность, но
          при реализации она распалась на три
          таблицы в БД.
 26                                             МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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.actionImplemente
d() 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.actionImplement
ed() called.");                                             }
    }
}




    27                                                                       МАИ, каф 806, ППС
Паттерны проектирования. Структурные паттерны


 Composite
         Описание задачи
          При работе с иерархичными
          объектами часто нужно иметь
          возможность работать с ними вне
          зависимости составной это объект
          или простой.
         Описание решения
          У всех объектов в иерархии
          выделяются как общие интерфейсы
          так и характерные только для
          сложных объектов.
         Когда применять
          Всегда при работе с динамическими
          структурами данных.
         Пример
          При реализации текстового редактора
          нужно с помощью одинакового
          интерфейса (operation) уметь
          отрисовывать как сложные объекты
          (параграфы), так и простые (буквы).



 28                                             МАИ, каф 806, ППС
Паттерны проектирования. Структурные паттерны
 Composite


Однотипно работаем с простыми и сложными объектами!




 29                                                   МАИ, каф 806, ППС
Паттерны проектирования
 структурные паттерны/ 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, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС
Паттерны проектирования. Структурные паттерны


 Decorator
         Описание задачи
          Иногда появляется необходимость
          менять свойства объектов не на
          стадии проектирования, а на стадии
          выполнения.
         Описание решения
          Создается класс-декоратор, который
          добавляет новые свойства к объекту
          данного класса и модифицирует
          существующие (сохраняя интерфейс
          старого класса)
         Когда применять
          Если существует много способов для
          реализации одного и того же
          действия (в зависимости от разных
          условий).
         Пример
          Работа с потоками ввода-вывода в
          Java.




 32                                            МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС
Паттерны проектирования. Структурные паттерны


 Facade
         Описание задачи
          Система имеет сложную внутреннюю
          структуру, которая часто меняется.
          При этом внешняя система должна
          иметь возможность использовать
          функционал нашей системы.
         Описание решения
          Создается класс-фасад, который
          скрывает внутреннее устройство
          системы.
         Когда применять
          Всегда. Если необходимо
          предоставить интерфейсы внешней
          системе.
         Пример
          При реализации программы-
          калькулятора для каждой
          математической функции пишется
          отдельный класс, но для
          пользовательского интерфейса
          делается один фасад.


 34                                            МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС
Паттерны проектирования.
cтруктурные паттерны/ Flyweight

        Описание задачи
         В системе есть большое число
         объектов у которых можно выделить
         общие свойства с общими
         значениями.
        Описание решения
         Общие свойства выделяются в
         отдельный объект, который
         передается всем объектам в
         операциях, использующих данное
         свойство.
        Когда применять
         В системе большое число объектов и
         стоимость хранения объектов
         достаточно большая (из-за числа или
         размера).
        Пример
         При реализации графического
         редактора контекст отображения –
         общее свойство, которое может быть
         вынесено наружу.




36                                             МАИ, каф 806, ППС
Паттерны проектирования.
 cтруктурные паттерны/ Flyweight


 Применяйте этот паттерн, когда выполнены все нижеперечисленные условия:
    в приложении используется большое число объектов;
    из-за этого накладные расходы на хранение высоки;
    большую часть состояния объектов можно вынести вовне;
    многие группы объектов можно заменить относительно небольшим количеством
          разделяемых объектов, поскольку внешнее состояние вынесено;
         приложение не зависит от идентичности объекта.
          Поскольку flyweight могут разделяться, то проверка на идентичность возвратит «истину≫
          для концептуально различных объектов;




 37                                                         МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС
Паттерны проектирования
cтруктурные паттерны/ proxy



        Описание задачи
         Есть необходимость при выполнении
         действий над объектами проводить
         дополнительные процедуры (какие
         именно определяется только в
         процессе выполнения).
        Описание решения
         Делается объект-обертка с такими же
         интерфейсами.
        Когда применять
         Работа в разных адресных
         пространствах (Remoting),
         динамическое создание объектов,
         динамический подсчет ссылок на
         объекты и т.д.
        Пример
         Мониторинг вызовов к методам
         объекта. К каждому методу
         добавляется код с трассировками.




40                                             МАИ, каф 806, ППС
Паттерны проектирования
 cтруктурные паттерны/ proxy


 удаленный заместитель
      предоставляет локального представителя вместо объекта, находящегося в другом адресном
      пространстве;
 виртуальный заместитель
      создает ≪тяжелые≫ объекты по требованию;
 защищающий заместитель
      контролирует доступ к исходному объекту. Такие заместители полезны, когда для разных
      объектов определены различные права доступа.
 ≪умная≫ ссылка
      это замена обычного указателя. Она позволяет выполнить дополнительные действия при
      доступе к объекту. К типичным применениям такой ссылки можно отнести:
          подсчет числа ссылок на реальный объект, с тем чтобы занимаемую им память можно
           было освободить автоматически, когда не останется ни одной ссылки;
          загрузку объекта в память при первом обращении к нему;
          проверку и установку блокировки на реальный объект при обращении к нему, чтобы
           никакой другой объект не смог в это время изменить его.




 41                                                         МАИ, каф 806, ППС
Паттерны проектирования
    структурные паттерны/ 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, ППС

More Related Content

PDF
Объектно-ориентированное программирование. Лекция 7 и 8.
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
PPTX
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
PDF
Архитектура. Доступноять программных систем.
PPT
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
PPTX
Александр Фокин, Рефлексия в C++
PPTX
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
Архитектура. Доступноять программных систем.
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Александр Фокин, Рефлексия в C++
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков

What's hot (20)

PDF
C++ Базовый. Занятие 03.
PPTX
Что нового в Visual Studio 2010 и .Net 4.0
PPTX
Основы Java. 5. Databases
PDF
C++ STL & Qt. Занятие 05.
PDF
C++ STL & Qt. Занятие 03.
PDF
C++ STL & Qt. Занятие 10.
PDF
C# Desktop. Занятие 07.
PDF
C++ STL & Qt. Занятие 02.
PPTX
PDF
C++ Базовый. Занятие 04.
PPTX
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
PDF
C++ STL & Qt. Занятие 04.
PDF
C++ осень 2013 лекция 2
PPTX
Bytecode
PPTX
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
PDF
C++ STL & Qt. Занятие 11.
PDF
Цена ошибки
PDF
C++ осень 2013 лекция 4
PDF
пр6 (2часа)b pwin
PDF
C++ осень 2013 лекция 6
C++ Базовый. Занятие 03.
Что нового в Visual Studio 2010 и .Net 4.0
Основы Java. 5. Databases
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 10.
C# Desktop. Занятие 07.
C++ STL & Qt. Занятие 02.
C++ Базовый. Занятие 04.
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
C++ STL & Qt. Занятие 04.
C++ осень 2013 лекция 2
Bytecode
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
C++ STL & Qt. Занятие 11.
Цена ошибки
C++ осень 2013 лекция 4
пр6 (2часа)b pwin
C++ осень 2013 лекция 6
Ad

Viewers also liked (10)

PDF
Проектирование программных систем. Занятие 6
PDF
Проектирование программных систем. Занятие 1
PDF
Проектирование программных систем. Занятие 7
PDF
Проектирование программных систем. Занятие 8
PDF
Проектирование программных систем. Занятие 5
PDF
Проектирование программных систем. Занятие 2
PDF
Проектирование программных систем. Занятие 4
PDF
Объектно-ориентированное программирование. Лекции 11 и 12
PDF
Проектирование программных систем. Занятие 3
PDF
Объектно-ориентированное программирование. Лекции 15 и 16
Проектирование программных систем. Занятие 6
Проектирование программных систем. Занятие 1
Проектирование программных систем. Занятие 7
Проектирование программных систем. Занятие 8
Проектирование программных систем. Занятие 5
Проектирование программных систем. Занятие 2
Проектирование программных систем. Занятие 4
Объектно-ориентированное программирование. Лекции 11 и 12
Проектирование программных систем. Занятие 3
Объектно-ориентированное программирование. Лекции 15 и 16
Ad

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

PPTX
Mikhail Valkov_Antipatterns
PDF
Gang of four review.Structural patterns
PDF
ук 03.003.01 2011
PPTX
Проектирование архитектуры приложений
ODT
шаблоны проектирования
PPT
паттерны программирования
PPT
Шаблоны проектирования 1
PDF
Общие темы. Тема 02.
PPTX
Паттерны проектирования
PPTX
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
PPTX
Практические аспекты разработки ПО #3
PDF
Design of big applications in FP
PDF
Дизайн больших приложений в ФП
PPTX
Yuri Trukhin - Software developement best practices
ODP
Refactoring
PPT
Use case Patterns
PDF
Шаблоны проектирования в Magento
PDF
Шаблоны проектирования GoF
PDF
Архитектура для мобильных игр - с чего начать и популярные решения / Евгений ...
Mikhail Valkov_Antipatterns
Gang of four review.Structural patterns
ук 03.003.01 2011
Проектирование архитектуры приложений
шаблоны проектирования
паттерны программирования
Шаблоны проектирования 1
Общие темы. Тема 02.
Паттерны проектирования
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Практические аспекты разработки ПО #3
Design of big applications in FP
Дизайн больших приложений в ФП
Yuri Trukhin - Software developement best practices
Refactoring
Use case Patterns
Шаблоны проектирования в Magento
Шаблоны проектирования GoF
Архитектура для мобильных игр - с чего начать и популярные решения / Евгений ...

More from Dima Dzuba (17)

PDF
Объектно-ориентированное программирование. Лекции 13 и 14
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
PDF
Requirement modelling in software creation process
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
PDF
Модифицируемость программных систем
PDF
Производительность программных систем
PDF
Проектирование Программных Систем. Лекция 01
PDF
МАИ, Сети ЭВМ, Лекция №6
PDF
МАИ, Сети ЭВМ, Лекция №5
PDF
МАИ, Сети ЭВМ, Лекция №4
PDF
МАИ, Сети ЭВМ, Лекция №3
PDF
МАИ, Сети ЭВМ, Лекция №2
PDF
МАИ, Сети ЭВМ, Лекция №1
PDF
МАИ, Сети ЭВМ, Лекция №7
PDF
Решение конфликтов в процессе проектирования сложных систем
PPTX
Arch intro4sts
PDF
Проектирование программных систем. Занятие 10
Объектно-ориентированное программирование. Лекции 13 и 14
Объектно-ориентированное программирование. Лекции 9 и 10
Requirement modelling in software creation process
Объектно-ориентированное программирование. Лекция 5 и 6
Модифицируемость программных систем
Производительность программных систем
Проектирование Программных Систем. Лекция 01
МАИ, Сети ЭВМ, Лекция №6
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №3
МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №1
МАИ, Сети ЭВМ, Лекция №7
Решение конфликтов в процессе проектирования сложных систем
Arch intro4sts
Проектирование программных систем. Занятие 10

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

  • 1. Паттерны проектирования улучшение модифицируемости решения  Паттерн – это описание задачи и её типового решения  Состоит:  Имя  Постановка задачи  Описание решения  Описания когда данный паттерн необходимо применять  Примера 1 МАИ, каф 806, ППС
  • 2. Паттерны проектирования достоинства  Паттерны описывают часто возникающую проблему, и дают решение, которое может использоваться многократно.  Они помогают:  Быстро сфокусироваться на решении проблемы, как только вы распознали нужный паттерн.  Изучение паттернов помогает придти к новым идеям.  Предоставить единый язык для дискуссий.  Предоставить решение проблем из реального мира.  Объяснить причину, по которой выбирается решение.  Многократно использовать опыт предыдущих поколений дизайнеров систем.  Но:  Паттерны не содержат ответы на все вопросы и решения всех задач!  Неправильно идентифицированный и примененный паттерн доставит больше неприятности, чем пользы. 2 МАИ, каф 806, ППС
  • 3. Паттерны проектирования Создание объектов  Описывают способы как можно создавать объекты в программе.  Борется с основным видом зависимости между модулями – знанием о существовании модуля и месте расположения.  Самое серьезное препятствие лежит в жестко зашитой в код информации о том, какие классы инстанцируются.  С помощью порождающих паттернов можно различными способами избавиться от явных ссылок на конкретные классы из кода.  Паттерны:  Abstract Factory  Builder  Factory Method  Prototype  Singleton 3 МАИ, каф 806, ППС
  • 4. Паттерны проектирования Создание объектов/Abstract Factory  Описание задачи Требуется иметь интерфейс для создания серии однотипных объектов.  Описание решения Создание отдельного класса отвечающего за создание экземпляров объектов.  Когда применять Можно выделить группы схожих объектов. Т.е. в одном случае мы создаем один набор объектов (одной фабрикой) в другом случае другой набор объектов (другой фабрикой)  Пример Интерфейс пользователя с набором «скинов». Т.е. набор различных по отображению интерфейсов но с одинаковой функциональностью. Доступ к базе данных (когда для разных СУБД есть разные объекты доступа) 4 МАИ, каф 806, ППС
  • 5. Паттерны проектирования Создание объектов/Abstract Factory  AbstractFactory - абстрактная фабрика: объявляет интерфейс для операций, создающих абстрактные объекты-продукты;  ConcreteFactory - конкретная фабрика: реализует операции, создающие конкретные объекты-продукты;  AbstractProduct - абстрактный продукт: объявляет интерфейс для типа объекта-продукта;  ConcreteProduct - конкретный продукт: определяет объект-продукт, создаваемый соответствующей конкретной фабрикой и реализует интерфейс Abstract Product;  Client - клиент: пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct. 5 МАИ, каф 806, ППС
  • 6. Паттерны проектирования Создание объектов/Abstract Factory Так это выглядит в жизни 6 МАИ, каф 806, ППС
  • 7. Паттерны проектирования Создание объектов/Abstract Factory interface 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. Паттерны проектирования создание объектов/ builder  Описание задачи Необходимо конструировать сложные объекты. При этом объекты со схожей конструкцией могут создаваться из разных объектов.  Описание решения Выделяется специальный объект, реализующий алгоритм создания сложного объекта. Создаются объекты, для создания частей составного объекта.  Когда применять Когда есть набор сложных объектов, состоящих из однотипных частей и имеющих схожий алгоритм создания.  Пример Преобразование форматов, когда нужно применить последовательно серию преобразований. Например при переводе текста из одного формата в другой мы последовательно применяем наборы преобразований параграфов, слов, шрифтов … 8 МАИ, каф 806, ППС
  • 9. Паттерны проектирования создание объектов/ builder Паттерн реализует конвейер 9 МАИ, каф 806, ППС
  • 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. Паттерны проектирования cоздание объектов / Factory Method  Описание задачи Внутри метода класса нам нужно создавать экземпляр другого класса. При этом в наследниках, нам возможно понадобится создавать другие классы.  Описание решения Конструктор класса вызывается в специальном методе, который может быть переопределен в наследнике.  Когда применять Хорошо все вызовы new оформлять в виде отдельных методов, где это возможно.  Пример Приложение может использовать различные библиотеки для доступа к базе данных. Создание экземпляра объекта-библиотеки может определяться конфигурацией. 11 МАИ, каф 806, ППС
  • 12. Паттерны проектирования cоздание объектов / Factory Method  Две основных разновидности паттерна.  Во-первых, это случай, когда класс Сгeator'является абстрактным и не содержит реализации объявленного в нем фабричного метода.  Вторая возможность: Creator – конкретный класс, в котором по умолчанию есть реализация фабричного метода. Редко, но встречается и абстрактный класс, имеющий реализацию по умолчанию;  Параметризованные фабричные методы. Это еще один вариант паттерна, который позволяет фабричному методу создавать разные виды продуктов. Фабричному методу передается параметр, который идентифицирует вид создаваемого объекта. Все объекты, получающиеся с помощью фабричного метода, разделяют общий интерфейс Product.. 12 МАИ, каф 806, ППС
  • 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. Паттерны проектирования. создание объектов/ Prototype  Описание задачи Необходимо создавать объект «по образцу».  Описание решения У объектов, требующих копирование создается метод Clone дублирующий объект.  Когда применять Много объектов требующих создание по образцу или жесткие требования к модифицируемости программы.  Пример Графический редактор, где на палитре «инструментов» размещаются объекты. При помещении из в рабочее поле создаются копии объектов с палитры. 14 МАИ, каф 806, ППС
  • 15. Паттерны проектирования. создание объектов/ Prototype  Варианты реализации  использование диспетчера прототипов.  реализация операции Clone.  Преимущества  добавление и удаление продуктов во время выполнения.  спецификация новых объектов путем изменения значений.  Недостатки  Основной недостаток паттерна прототип заключается в том, что каждый подкласс класса Prototype должен реализовывать операцию Clone, а это далеко не всегда просто. Например, сложно добавить операцию Clone, когда рассматриваемые классы уже существуют.  Проблемы возникают и в случае, если во внутреннем представлении объекта есть другие объекты или наличествуют круговые ссылки 15 МАИ, каф 806, ППС
  • 16. Паттерны проектирования. создание объектов/ Prototype Клонирование человека запрещено! С программными объектами – все проще. 16 МАИ, каф 806, ППС
  • 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. Паттерны проектирования создание объектов/ Singleton  Описание задачи В программе существуют глобальные объекты с одним экземпляром на всю программу.  Описание решения Класс объекта хранит ссылку на сам объект и может инициировать создание объекта как при первом обращении так и при старте программы.  Когда применять Всегда когда нужно хранить глобальные свойства системы или иметь доступ к глобальному ресурсу (если он может существовать только в одном экземпляре)  Пример Например, при отправке сообщений в очередь мы хотим убедится что у нас не будет конфликтов из-за многопоточности. Поэтому мы создаем один объект по работе с данной очередью и вставляем в нем мониторы. 18 МАИ, каф 806, ППС
  • 19. Паттерны проектирования создание объектов/ Singleton  Преимущества  контролируемый доступ к единственному экземпляру.  уменьшение числа имен, используемых в системе.  допускает уточнение операций и представления.  допускает переменное число экземпляров.  большая гибкость, чем у операций класса.  Реализация  гарантирование единственного экземпляра.  порождение подклассов Singleton (при необходимости). 19 МАИ, каф 806, ППС
  • 20. Паттерны проектирования создание объектов/ Singleton Должен остаться только один! 20 МАИ, каф 806, ППС
  • 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. Паттерны проектирования Структурные патерны  Предназначены для организации сложных структур объектов.  Помогают упростить работу со сложными структурами.  Включают:  Adapter  Bridge  Composite  Decorator  Facade  Flyweight  Proxy 22 МАИ, каф 806, ППС
  • 23. Паттерны проектирования. Структурные паттерны  Adapter  Описание задачи Существует необходимость использовать для решения задачи класс с отличной от изначально спроектированной структуры.  Описание решения Создается специальный адаптер для конвертации интерфейсов.  Когда применять Когда проще сделать адаптер, чем переписать остальную систему на использование нового интерфейса.  Пример Для доступа к БД использовался механизм ODBC, но понадобилось использовать новую БД для которой есть только ADO интерфейс. 23 МАИ, каф 806, ППС
  • 24. Паттерны проектирования. Структурные паттерны адаптер С одной стороны 220 вольт, а с другой – столько сколько нужно! 24 МАИ, каф 806, ППС
  • 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 yet public 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. Паттерны проектирования. Структурные паттерны  Bridge  Описание задачи При проектировании системы интерфейсы строятся исходя из терминов предметной области (абстракции), однако реализация не всегда близка к предметной области. Нужен механизм который позволяет связать абстракцию и реализацию.  Описание решения Создается класс Abstraction с описанием сценария работы с конкретной реализацией абстракции.  Когда применять Абстракция и реализация может развиваться независимо (например, в различных случаях может использоваться различная реализация)  Пример При проектировании БД в интерфейсе была определена одна сущность, но при реализации она распалась на три таблицы в БД. 26 МАИ, каф 806, ППС
  • 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.actionImplemente d() 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.actionImplement ed() called."); } } } 27 МАИ, каф 806, ППС
  • 28. Паттерны проектирования. Структурные паттерны  Composite  Описание задачи При работе с иерархичными объектами часто нужно иметь возможность работать с ними вне зависимости составной это объект или простой.  Описание решения У всех объектов в иерархии выделяются как общие интерфейсы так и характерные только для сложных объектов.  Когда применять Всегда при работе с динамическими структурами данных.  Пример При реализации текстового редактора нужно с помощью одинакового интерфейса (operation) уметь отрисовывать как сложные объекты (параграфы), так и простые (буквы). 28 МАИ, каф 806, ППС
  • 29. Паттерны проектирования. Структурные паттерны Composite Однотипно работаем с простыми и сложными объектами! 29 МАИ, каф 806, ППС
  • 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. Паттерны проектирования структурные паттерны/ 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. Паттерны проектирования. Структурные паттерны  Decorator  Описание задачи Иногда появляется необходимость менять свойства объектов не на стадии проектирования, а на стадии выполнения.  Описание решения Создается класс-декоратор, который добавляет новые свойства к объекту данного класса и модифицирует существующие (сохраняя интерфейс старого класса)  Когда применять Если существует много способов для реализации одного и того же действия (в зависимости от разных условий).  Пример Работа с потоками ввода-вывода в Java. 32 МАИ, каф 806, ППС
  • 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. Паттерны проектирования. Структурные паттерны  Facade  Описание задачи Система имеет сложную внутреннюю структуру, которая часто меняется. При этом внешняя система должна иметь возможность использовать функционал нашей системы.  Описание решения Создается класс-фасад, который скрывает внутреннее устройство системы.  Когда применять Всегда. Если необходимо предоставить интерфейсы внешней системе.  Пример При реализации программы- калькулятора для каждой математической функции пишется отдельный класс, но для пользовательского интерфейса делается один фасад. 34 МАИ, каф 806, ППС
  • 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. Паттерны проектирования. cтруктурные паттерны/ Flyweight  Описание задачи В системе есть большое число объектов у которых можно выделить общие свойства с общими значениями.  Описание решения Общие свойства выделяются в отдельный объект, который передается всем объектам в операциях, использующих данное свойство.  Когда применять В системе большое число объектов и стоимость хранения объектов достаточно большая (из-за числа или размера).  Пример При реализации графического редактора контекст отображения – общее свойство, которое может быть вынесено наружу. 36 МАИ, каф 806, ППС
  • 37. Паттерны проектирования. cтруктурные паттерны/ Flyweight  Применяйте этот паттерн, когда выполнены все нижеперечисленные условия:  в приложении используется большое число объектов;  из-за этого накладные расходы на хранение высоки;  большую часть состояния объектов можно вынести вовне;  многие группы объектов можно заменить относительно небольшим количеством разделяемых объектов, поскольку внешнее состояние вынесено;  приложение не зависит от идентичности объекта. Поскольку flyweight могут разделяться, то проверка на идентичность возвратит «истину≫ для концептуально различных объектов; 37 МАИ, каф 806, ППС
  • 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. Паттерны проектирования структурные паттерны/ 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. Паттерны проектирования cтруктурные паттерны/ proxy  Описание задачи Есть необходимость при выполнении действий над объектами проводить дополнительные процедуры (какие именно определяется только в процессе выполнения).  Описание решения Делается объект-обертка с такими же интерфейсами.  Когда применять Работа в разных адресных пространствах (Remoting), динамическое создание объектов, динамический подсчет ссылок на объекты и т.д.  Пример Мониторинг вызовов к методам объекта. К каждому методу добавляется код с трассировками. 40 МАИ, каф 806, ППС
  • 41. Паттерны проектирования cтруктурные паттерны/ proxy  удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве;  виртуальный заместитель создает ≪тяжелые≫ объекты по требованию;  защищающий заместитель контролирует доступ к исходному объекту. Такие заместители полезны, когда для разных объектов определены различные права доступа.  ≪умная≫ ссылка это замена обычного указателя. Она позволяет выполнить дополнительные действия при доступе к объекту. К типичным применениям такой ссылки можно отнести:  подсчет числа ссылок на реальный объект, с тем чтобы занимаемую им память можно было освободить автоматически, когда не останется ни одной ссылки;  загрузку объекта в память при первом обращении к нему;  проверку и установку блокировки на реальный объект при обращении к нему, чтобы никакой другой объект не смог в это время изменить его. 41 МАИ, каф 806, ППС
  • 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, ППС