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, ППС
8. Паттерны проектирования
создание объектов/ builder
Описание задачи
Необходимо конструировать сложные
объекты. При этом объекты со схожей
конструкцией могут создаваться из
разных объектов.
Описание решения
Выделяется специальный объект,
реализующий алгоритм создания
сложного объекта. Создаются объекты,
для создания частей составного объекта.
Когда применять
Когда есть набор сложных объектов,
состоящих из однотипных частей и
имеющих схожий алгоритм создания.
Пример
Преобразование форматов, когда нужно
применить последовательно серию
преобразований. Например при переводе
текста из одного формата в другой мы
последовательно применяем наборы
преобразований параграфов, слов,
шрифтов …
8 МАИ, каф 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, ППС
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, ППС
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, ППС
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, ППС
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, ППС