SlideShare uma empresa Scribd logo
1 de 42
Baixar para ler offline
Паттерны проектирования
 улучшение модифицируемости решения


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




 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, ППС

Mais conteúdo relacionado

Mais procurados

C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0akrakovetsky
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 

Mais procurados (20)

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

Destaque

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

Destaque (10)

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

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

паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5Dima Dzuba
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsCiklum
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4Bars Group
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9Technopark
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подходakopium
 

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

паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подход
 

Mais de Dima Dzuba

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

Mais de Dima Dzuba (16)

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