Статьи

Образец ссуды на Яве (иначе образец ссудодателя)

Этот пост о реализации шаблона займа в 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 .