Давайте посмотрим ниже, чтобы начать с
enhance existing behavior of an object at run time without destroying the existing interface of the object
. Вопрос: Объект извлекается из его класса, который является временем компиляции. Теперь, как бы вы продолжили улучшать поведение?
Ответ: Используя шаблон Decorator, также известный как обертка.
Пример: у вас есть файл, который можно зашифровать, скажем, методов шифрования в настоящее время 5, в результате будет зашифрованный файл. Зашифрованный файл может быть снова зашифрован. Кроме того, давайте предположим, что существует 5 способов заархивировать файл, который впоследствии может увеличиться. Файл может быть зашифрован с помощью methodEA, затем может быть заархивирован с помощью MethodZA, затем снова может быть зашифрован с помощью methodEB, аналогичные последовательности могут создавать разные файлы результатов.
Один из хороших способов, как показано ниже.
public class TextFile{
public void create(){/*somecode*/};
public void format(){//code for default plain text};
}
public class AEncryptedFile extends TextFile{
private TextFile wrapped;
public AEncryptedFile(TextFile file){
this.wrapped = file;
}
public void format(){
super.format();
//add enhacements for encryption type A
}
}
public class BEncryptedFile extends TextFile{
private TextFile wrapped;
public BEncryptedFile(TextFile file){
this.wrapped = file;
}
public void format(){
super.format();
//add enhacements for encryption type B
}
}
public class AZippedFile extends TextFile{
private TextFile wrapped;
public BEncryptedFile(TextFile file){
this.wrapped = file;
}
public void format(){
super.format();
//add enhacements for zip type A
}
}
public class BZippedFile extends TextFile{
private TextFile wrapped;
public BEncryptedFile(TextFile file){
this.wrapped = file;
}
public void format(){
super.format();
//add enhacements for zip type B
}
}
public void UserClass{
public static void main(String[] args){
TextFile file = new BZippedFile(new AEncryptedFile(new TextFile()));
file.format();
}
В вышеприведенном примере кода можно сказать
Объект TextFile был декорирован (обтеканием) объектом AEncryptedFile, который дополнительно декорируется BZippedFile, в каждом из этих дополнительных украшений дополнительное улучшение был создан для существующего объекта
Таким образом, существующий объект TextFile может быть передан различным методам во время выполнения, а объект может быть декорирован путем обертывания его в другой объект подтипа TextFile.
Примечание : Реализация шаблона декоратора имеет структуру LinkedList.
Обычно у меня просто был бы сценарий оболочки, который запускает приложение. В сценарии оболочки я установил бы LD_LIBRARY_PATH на то, чем я нуждаюсь в нем, чтобы быть для того приложения, затем имею сценарий, запускают то приложение. При выполнении его тот путь должен заставить путь быть установленным только для того приложения.
Можно найти формальное описание LD_LIBRARY_PATH
на странице справочника для "ld.so.1", т.е. выполненном "человеке ld.so.1". Это также описывает некоторые другие переменные, которые соблюдает компоновщик во время выполнения.
В дополнение к LD_LIBRARY_PATH
, исполняемые файлы и совместно использованные библиотеки могут также иметь встроенный путь поиска для библиотек. При запуске приложения, которое Вы связали сами, можно использовать-R опцию ld установить созданный в пути (и Sun, CC и gcc имеют опции сделать то же самое). Это может позволить Вам избегать использования LD_LIBRARY_PATH
во-первых.
Можно использовать команду crle:
crle -l /path/to/your/lib/file
. Ответ crle наиболее правильный. В Solaris не следует использовать LD_LIBRARY_PATH
. Вместо этого используйте crle. Чтобы просмотреть текущие пути, просто запустите "crle" отдельно. Чтобы обновить список, используйте crle -u -l / path / to / your / lib / directory
. -u
необходим для записи изменений в конфигурацию системы, в противном случае изменение будет временным. Смотрите справочную страницу для получения дополнительных опций.