- Delegate class in java
- Constructor Summary
- Method Summary
- Methods inherited from class java.lang.Object
- Constructor Detail
- Delegate
- Method Detail
- get_interface_def
- duplicate
- release
- is_a
- non_existent
- is_equivalent
- hash
- request
- create_request
- create_request
- orb
- get_policy
- get_domain_managers
- set_policy_override
- is_local
- servant_preinvoke
- servant_postinvoke
- request
- invoke
- releaseReply
- toString
- hashCode
- equals
- Java Blog
- Пример использования паттерна делегирования на Java
- Комментарии
- Отправить комментарий
- Популярные сообщения из этого блога
- Методы класса Object в Java
- Как получить текущий timestamp в Java
- Spring Boot стартеры
- Pro Java
Delegate class in java
Specifies a portable API for ORB-vendor-specific implementation of the org.omg.CORBA.Object methods. Each stub (proxy) contains a delegate object, to which all org.omg.CORBA.Object methods are forwarded. This allows a stub generated by one vendor’s ORB to work with the delegate from another vendor’s ORB.
Constructor Summary
Method Summary
Modifier and Type | Method and Description |
---|---|
abstract Request | create_request (Object obj, Context ctx, String operation, NVList arg_list, NamedValue result) |
Provides the implementation to override the equals(java.lang.Object obj) method of the delegating CORBA object.
releaseReply may optionally be called by a stub to release a reply stream back to the ORB when the unmarshaling has completed.
servant_postinvoke() is invoked by the local stub after the operation has been invoked on the local servant.
Methods inherited from class java.lang.Object
Constructor Detail
Delegate
Method Detail
get_interface_def
public abstract Object get_interface_def(Object self)
duplicate
release
is_a
non_existent
is_equivalent
hash
request
public abstract Request request(Object obj, String operation)
create_request
public abstract Request create_request(Object obj, Context ctx, String operation, NVList arg_list, NamedValue result)
create_request
public abstract Request create_request(Object obj, Context ctx, String operation, NVList arg_list, NamedValue result, ExceptionList exclist, ContextList ctxlist)
orb
get_policy
public Policy get_policy(Object self, int policy_type)
get_domain_managers
public DomainManager[] get_domain_managers(Object self)
Retrieves the DomainManagers of this object. This allows administration services (and applications) to retrieve the domain managers, and hence the security and other policies applicable to individual objects that are members of the domain.
set_policy_override
public Object set_policy_override(Object self, Policy[] policies, SetOverrideType set_add)
Associates the policies passed in with a newly created object reference that it returns. Only certain policies that pertain to the invocation of an operation at the client end can be overridden using this operation. Attempts to override any other policy will result in the raising of the CORBA::NO_PERMISSION exception.
is_local
servant_preinvoke
public ServantObject servant_preinvoke(Object self, String operation, Class expectedType)
Returns a Java reference to the servant which should be used for this request. servant_preinvoke() is invoked by a local stub. If a ServantObject object is returned, then its servant field has been set to an object of the expected type (Note: the object may or may not be the actual servant instance). The local stub may cast the servant field to the expected type, and then invoke the operation directly. The ServantRequest object is valid for only one invocation, and cannot be used for more than one invocation.
servant_postinvoke
public void servant_postinvoke(Object self, ServantObject servant)
servant_postinvoke() is invoked by the local stub after the operation has been invoked on the local servant. This method must be called if servant_preinvoke() returned a non-null value, even if an exception was thrown by the servant’s method. For this reason, the call to servant_postinvoke() should be placed in a Java finally clause.
request
public OutputStream request(Object self, String operation, boolean responseExpected)
request is called by a stub to obtain an OutputStream for marshaling arguments. The stub must supply the operation name, and indicate if a response is expected (i.e is this a oneway call).
invoke
public InputStream invoke(Object self, OutputStream output) throws ApplicationException, RemarshalException
invoke is called by a stub to invoke an operation. The stub provides an OutputStream that was previously returned by a request() call. invoke returns an InputStream which contains the marshaled reply. If an exception occurs, invoke may throw an ApplicationException object which contains an InputStream from which the user exception state may be unmarshaled.
releaseReply
releaseReply may optionally be called by a stub to release a reply stream back to the ORB when the unmarshaling has completed. The stub passes the InputStream returned by invoke() or ApplicationException.getInputStream(). A null value may also be passed to releaseReply, in which case the method is a noop.
toString
hashCode
equals
Provides the implementation to override the equals(java.lang.Object obj) method of the delegating CORBA object.
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2023, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.
Java Blog
Паттерн делегирования (Delegation) является поведенческим (behavioral) паттерном проектрования.
Это техника, в которой объект выражает определенное поведение снаружи, но в реальности делегирует ответственность за реализацию этого поведения связанному объекту.
Паттерн делегирования обеспечивает механизм отвлечения от реализации и контроля желаемого действия. Класс, вызываемый для выполнения действия, не выполняет его, а фактически делегирует вспомогательному классу. Потребитель не имеет или не требует знания фактического класса, выполняющего действие, только контейнера, к которому производится вызов.
Используйте шаблон делегата для достижения следующего:
- Уменьшение связанности методов с их классом
- Работы компонентов, которые ведут себя одинаково, но предполагается, что эта ситуация может измениться в будущем.
Пример использования паттерна делегирования на Java
Предположим у нас есть автомобиль — интерфейс Car, имеющий метод ride:
package example; public interface Car
Класс CarController реализует интерфейс Car, но сам действие не выполняет, а делегирует это вспомогательному классу, экземпляр которого хранит в своем поле car:
package example; public class CarController implements Car < private final Car car; public CarController(Car car) < this.car = car; >@Override public void ride(String name) < car.ride(name); >; >
Есть вспомогательные классы которые непосредственно выполняют действие — BMWCar, MercedesCar, VolvoCar — они также реализуют интерфейс Car, но в самом приложении вызываются опосредованно через экземпляр класса CarController, который делегирует им выполнение работы:
package example.cars; import example.Car; public class BMWCar implements Car < @Override public void ride(String name) < System.out.println(name + " rides in BMW"); >; >
package example.cars; import example.Car; public class MercedesCar implements Car < @Override public void ride(String name) < System.out.println(name + " rides in Mercedes"); >; >
package example.cars; import example.Car; public class VolvoCar implements Car < @Override public void ride(String name) < System.out.println(name + " rides in Volvo"); >; >
В самом приложении экземпляры вспомогательных классов передаются в CarController и вызов на выполнение действия осуществляется на экземпляре класса CarController:
package example; import example.cars.*; public class App < private static final String RIDER = "Tom"; public static void main(String[] args) < CarController bmw = new CarController(new BMWCar()); CarController mercedes = new CarController(new MercedesCar()); CarController volvo = new CarController(new VolvoCar()); bmw.ride(RIDER); mercedes.ride(RIDER); volvo.ride(RIDER); >>
- Получить ссылку
- Электронная почта
- Другие приложения
Комментарии
Отправить комментарий
Популярные сообщения из этого блога
Методы класса Object в Java
Класс Object является корнем иерархии классов. У каждого класса есть Object как суперкласс. Все объекты, включая массивы, реализуют методы этого класса. Методы класса Object Метод getClass() public final Class getClass() Возвращает класс времени исполнения (runtime class) этого Object. Возвращенный объект Class — это объект, который заблокирован статическими синхронизированными методами представленного класса. Фактический тип результата — Class где |X| заменяется статическим типом выражения, для которого вызывается getClass. Например, в этом фрагменте кода не требуется приведение: Number n = 0; Class c = n.getClass(); Метод getClass() возвращает: Объект Class, представляющий класс времени исполнения (runtime class) этого объекта. Метод hashCode public int hashCode() Возвращает значение хэш-кода для объекта. Этот метод поддерживается для использования хэш-таблиц, таких как те, что предоставляются HashMap. Основной контракт метода hashCo?>
Как получить текущий timestamp в Java
Чтобы получить текущий timestamp в Java : package main; import java.sql.Timestamp; public class Main < public static void main(String[] args)< Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println(timestamp); >> Вывод: 2019-10-03 10:09:21.61 Вот еще два более подробных примера как получить текущий timestamp в Java: 1. java.sql.Timestamp Есть два метода получить текущий java.sql.Timestamp package main; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Date; public class Main < private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss"); public static void main(String[] args) < // Метод 1 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println(timestamp); // Метод 2 - через Date Date date = new Date(); System.out.println(new Timestamp(date.getTime()
Spring Boot стартеры
Стартеры — это набор удобных дескрипторов зависимостей, которые вы можете включить в свое приложение. Вы получаете универсальный набор для всех необходимых вам Spring и связанных с ними технологий без необходимости искать примеры кода и копировать и вставлять множество дескрипторов зависимостей. Например, если вы хотите начать использовать Spring и JPA для доступа к базе данных, включите в ваш проект зависимость spring-boot-starter-data-jpa. Стартеры содержат множество зависимостей, которые необходимы вам для быстрого запуска и запуска проекта с согласованным, поддерживаемым набором управляемых переходных зависимостей. Что указывается в имени стартера Все официальные стартеры следуют аналогичной схеме именования; spring-boot-starter-*, где * это конкретный тип приложения. Эта структура наименования предназначена, чтобы помочь, когда вам нужно найти стартер. Интеграция Maven во многие IDE позволяет вам искать зависимости по имени. Например, если установлен соответствующий плагин Ecl
Pro Java
Еще один вид отношений, не поддерживаемый в Java напрямую, называется делегированием (delegation). Он занимает промежуточное положение между наследованием и композицией: экземпляр существующего класса включается в создаваемый класс (как при композиции), но в то же время все или некоторые методы встроенного объекта становятся доступными в новом классе (как при наследовании) . Очень часто такие виды отношений используются при построении графического интерфейса, например для реализации модели MVC библиотека Swing использует делегирование.
А сейчас рассмотрим на простом примере что же это за зверь такой – делегирование.
Например, класс SpaceShipControls имитирует модуль управления космическим кораблем. А Для построения космического корабля можно воспользоваться наследованием в классе SpaceShip.
Однако космический корабль не может рассматриваться как частный случай своего управляющего модуля — несмотря на то, что ему, к примеру, можно приказать двигаться вперед (forward()). Точнее сказать, что SpaceShip содержит SpaceShipControls, и в то же время все методы последнего предоставляются классом SpaceShip. Проблема решается при помощи делегирования:
Как видите, вызовы методов переадресуются встроенному объекту controls, а интерфейс остается таким же, как и при наследовании. С другой стороны, делегирование позволяет лучше управлять происходящим, потому что вы можете ограничиться небольшим подмножеством методов встроенного объекта.