Этот пост о реализации шаблона займа в Java.
Случай использования
Реализуйте разделение между кодом, который содержит ресурс, и кодом доступа к нему, чтобы доступ к коду не требовал управления ресурсами. Упомянутый случай использования сохраняется, когда мы пишем код для чтения / записи в файл или запрашиваем базы данных SQL / NOSQL. Конечно, API справляются с этим с помощью AOP. Но я подумал, что если подход, основанный на шаблонах, может помочь нам справиться с подобными вариантами использования, я узнал о Loan Pattern (он же шаблон кредитора Ленди) .
Что оно делает
Шаблон ссуды использует «подход ссуды», то есть код, который удерживает ресурсы «ссуды», если к вызывающему коду. Кредитор (он же код, который содержит ресурсы) управляет ресурсами после того, как кредитор (код, обращающийся к ресурсу) использует их (без интереса). Давайте войдем в код кредитора:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/** * This class is an illustration of using loan pattern(a.k.a lender-lendee pattern) * @author prassee */ public class IOResourceLender { /** * Interface to write data to the buffer. Clients using this * class should provide impl of this interface * @author sysadmin * */ public interface WriteBlock { void call(BufferedWriter writer) throws IOException; } /** * Interface to read data from the buffer. Clients using this * class should provide impl of this interface * @author sysadmin * */ public interface ReadBlock { void call(BufferedReader reader) throws IOException; } /** * method which loans / lends the resource. Here {@link FileWriter} is the * resource lent. The resource is managed for the given impl of {@link WriteBlock} * * @param fileName * @param block * @throws IOException */ public static void writeUsing(String fileName, WriteBlock block) throws IOException { File csvFile = new File(fileName); if (!csvFile.exists()) { csvFile.createNewFile(); } FileWriter fw = new FileWriter(csvFile.getAbsoluteFile(), true ); BufferedWriter bufferedWriter = new BufferedWriter(fw); block.call(bufferedWriter); bufferedWriter.close(); } /** * method which loans / lends the resource. Here {@link FileReader} is the * resource lent. The resource is managed for * the given impl of {@link ReadBlock} * * @param fileName * @param block * @throws IOException */ public static void readUsing(String fileName, ReadBlock block) throws IOException { File inputFile = new File(fileName); FileReader fileReader = new FileReader(inputFile.getAbsoluteFile()); BufferedReader bufferedReader = new BufferedReader(fileReader); block.call(bufferedReader); bufferedReader.close(); } } |
Код кредитора содержит FileWriter, ресурс, и мы также ожидаем реализацию WriteBlock, так что метод writeUsing просто вызывает метод в интерфейсе WriteBlock, который заключен в управление ресурсом. На стороне клиента (lendee) мы предоставляем анонимную реализацию WriteBlock. Вот код lendee, я просто предоставляю метод, который вы можете использовать в классе, который вам может понравиться.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public void writeColumnNameToMetaFile( final String attrName, String fileName, final String[] colNames) throws IOException { IOResourceLender.writeUsing(fileName, new IOResourceLender.WriteBlock() { public void call(BufferedWriter out) throws IOException { StringBuilder buffer = new StringBuilder(); for (String string : colNames) { buffer.append(string); buffer.append( ',' ); } out.append(attrName + ' = ' + buffer.toString()); out.newLine(); } }); } |
В примере используется шаблон ссуды для простой операции ввода-вывода файла. Тем не менее, этот код может быть улучшен путем предоставления абстрактных кредиторов и lendee. Код этого поста опубликован в следующем гисте https://gist.github.com/4481190 Я приветствую ваши комментарии и предложения !!
Ссылка: Шаблон займа на Java (он же шаблон кредитора Ленди) от нашего партнера JCG Прасанны Кумар из блога Prassee on Scala .