Понимание и использование моделей дизайна может развивать наши хорошие объектно-ориентированные привычки программирования, и в реальных приложениях мы можем наслаждаться удовольствием быть непринужденным.
Прокси - это относительно полезная модель, и есть много вариантов. Объясняется как: от отправной точки до промежуточного слоя между направлениями, означающим агент.
Определено в шаблоне проектирования: предоставляет прокси для других объектов для управления доступом к этому объекту.
Зачем использовать прокси -режим
1. Пользователи авторизации различных уровней авторизации имеют различные права доступа к одному и тому же объекту. (незарегистрированные пользователи), а в Jive это позволяет вам контролировать права доступа этих двух пользователей на форум через прокси, такой как ForumProxy.
2. Клиент не может работать напрямую к объекту, но должен взаимодействовать с этим объектом.
Приведите два конкретных примера:
1. Если этот объект является большим изображением, и для его отображения требуется много времени, то когда изображение включено в документ, используйте редактор или браузер, чтобы открыть документ, и документ должен быть открыт очень быстро и не может ждать .
2. Если этот объект находится на удаленном сервере в Интернете и непосредственно управляет этим объектом может быть медленным из -за скорости сети, то мы можем сначала использовать прокси для замены этого объекта.
Короче говоря, этот принцип состоит в том, что для объектов с высокими накладными расходами они создаются только при его использовании. Поэтому некоторые люди думают, что Java потребляет ресурсную память, и я думаю, что это как -то связано с идеей программирования.
Как использовать прокси -режим
В качестве примера, принимая систему Jive Forum, есть много типов пользователей, которые посещают систему форумов: зарегистрированные обычные пользователи, менеджеры форумов, системные менеджеры и туристы. Только зарегистрируя обычного пользователя.
Форум является основным интерфейсом Jive.
Пользователи с различными уровнями разрешений определены на ForumPermissions:
Кода -копия выглядит следующим образом:
Общедоступный класс ForumPermissions реализует кэшируемый {
/**
* Разрешение на чтение объекта.
*/
Public Static Final int Read = 0;
/**
* Разрешение на администрацию всей системы.
*/
Public Static Final int System_admin = 1;
/**
* Разрешение на администрацию конкретный форум.
*/
Public Static Final int forum_admin = 2;
/**
* Разрешение на администрацию конкретного пользователя.
*/
Public Static Final int user_admin = 3;
/**
* Разрешение на администрацию конкретной группы.
*/
Public Static Final int Group_Admin = 4;
/**
* Разрешение на современные потоки.
*/
Public Static Final int mederate_threads = 5;
/**
* Разрешение на создание нового потока.
*/
Public Static Final int create_thread = 6;
/**
* Разрешение на создание нового сообщения.
*/
Public Static Final int create_message = 7;
/**
* Разрешение на современные сообщения.
*/
Public Static Final int mederate_messages = 8;
.....
Public Boolean Issystemorumadmin () {
return (values [forum_admin] || values [system_admin]);
}
.....
}
Таким образом, различные разрешения на операцию на форуме связаны с пользовательским уровнем, определяемым Forumpermissions. Например, при изменении имени форума только менеджер форума или системный менеджер может изменить его, код заключается в следующем:
Кода -копия выглядит следующим образом:
Форум публичного класса форума реализации {
Частные разрешения на форум;
Частный форум;
this.Authorization = разрешение;
Public ForumProxy (форум форум, авторизация авторизации,
Форумпермиссионные разрешения) {
this.forum = forum;
this.Authorization = разрешение;
this.permissions = разрешения;
}
.....
public void setName (string name) выбрасывает unauptorizedException,
ForumalReadeExistSexception {
// Только администратор системы или форума может изменить имя if (permissions.issystemorumadmin ()) {
Forum.SetName (имя);
}
еще {
бросить новый unaultorizedException ();
}
}
...
}
DBFORUM - это реальная реализация интерфейсного форума.
Кода -копия выглядит следующим образом:
Общедоступный класс DBFORUM реализует форум, Cashable {
...
public void setName (string name) Throws ForumalReadeExistSexception {
....
this.name = name;
// Здесь вы действительно сохраняете новое имя в базе данных в savetodb ();
....
}
...
}
Всякий раз, когда задействовано имени форума, другие программы должны сначала иметь дело с Forum Proxy.
В ежедневных приложениях неизбежно, что система авторизации или безопасности системы всегда будет вовлечена.
Давайте продолжим говорить более глубоко в сочетании с Jive, и заводская модель будет участвовать ниже.
Мы уже знаем, что использование форума требует использования форума. Singleton используется здесь (также один из моделей дизайна), GetInstance () возвращает ForumFactoryProxy.
Почему бы не вернуть ForumFactory, но вернуть ForumFactory реализация ForumFactoryProxy? Причина очевидна, и необходимо определить, имеет ли форум разрешение на создание его через прокси.
В ForumFactoryProxy мы видим код следующим образом:
Кода -копия выглядит следующим образом:
Public Class ForumFactoryProxy Extends ForumFactory {
Защищенный ForumFactory Factory;
Защищенное разрешение разрешения;
Защищенные разрешения на форум;
Public ForumFactoryProxy (разрешение на авторизацию, ForumFactory Factory, Pormpermissions разрешения) {
this.factory = factory;
this.Authorization = разрешение;
this.permissions = разрешения;
}
Общественный форум CreateForum (имя строки, описание строки)
бросает несанкционированное искусство, ForumalReadyExistSexception {
// только системные администраторы могут создавать форум
if (permissions.get (forumpermissions.system_admin)) {
Forum newforum = factory.createForum (имя, описание);
вернуть новый ForumProxy (Newforum, разрешение, разрешения);
}
еще {
бросить новый unaultorizedException ();
}
}
}
Метод CreateForum возвращает ForumProxy.
Обратите внимание, что здесь есть два прокси: Forumproxy и ForumFactoryProxy. Представляет две разные обязанности: использование форума и создание форума. Что касается того, почему использование объектов отделено от создания объектов, поэтому используется заводская шаблона: он предназначен для «инкапсуляции» и «отправки». Другими словами, функции максимально едины для облегчения обслуживания и модификации.
Другое создание постов и использование в системе Forum Jive основано на идее форума.
Выше мы обсуждали, как использовать прокси для доступа к механизму авторизации. Копирование огромного и сложного объекта является очень дорогой операцией. Используйте прокси, чтобы отложить этот процесс копирования.
Например: у нас есть большая коллекция, такая как хэштата, и многие клиенты получат доступ к ней одновременно одновременно. Один из особых клиентов должен выполнять непрерывное сборы данных, и в настоящее время другие клиенты больше не добавляют и не удаляют вещи в хэштеб.
Наиболее прямым решением является: используйте блокировку коллекции, пусть этот специальный клиент получит эту блокировку, выполните непрерывное сборы данных, а затем отпустите блокировку.
Кода -копия выглядит следующим образом:
public void fofetches (hashtable ht) {
синхронизированный (ht) {
// конкретное непрерывное действие сбора данных ...
}
}
Тем не менее, этот метод может заблокировать коллекцию в течение длительного времени, и другие клиенты не смогут получить доступ к коллекции в течение этого периода.
Второе решение состоит в том, чтобы закрыть сбор, а затем позволить непрерывным данным получить операцию сбора для клона. Это решение основано на том факте, что коллекция является клонированной, и должен быть метод обеспечения глубокого клона. Hashtable предоставляет свой собственный метод клона, но не клон объектов ключа и значения.
Кода -копия выглядит следующим образом:
public void fofetches (hashtable ht) {
Hashttable newht = (hashtable) ht.clone ();
}
Проблема возникает снова.
Окончательное решение: мы можем подождать, пока другие клиенты не завершит модификацию перед клонированием, то есть этот специальный клиент сначала выполняет серию операций сбора данных, вызывая метод под названием Clone. Но на самом деле, ни одно копирование объекта фактически не было сделано, пока другие клиенты не изменят сбор объектов.
Реализуйте это решение с помощью Proxy, которая является операцией копирования на записи.
Прокси имеет широкий спектр приложений.