Задача 1A. Singleton

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Напишите класс, реализующий шаблон проектирования Singleton.


public class Singleton
{
  public static Singleton getInstance() { ... }
  public int usage() { ... }
}

Метод getInstance должен возвращать экземпляр класса.

Метод usage должен возвращать количество вызовов метода getInstance.

Формат выходных данных

Код решения должен содержать только класс Singleton с реализацией функций getInstance и usage. Он не должен ничего выводить.


Задача 1B. Builder

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Напишите класс, реализующий шаблон проектирования Builder, который строит целое число путём применения арифметических операций.


public class Builder
{
  public Builder(int x) { ... }
  public Builder add(int x) { ... }
  public Builder sub(int x) { ... }
  public Builder mul(int x) { ... }
  public Integer build() { ... }
}

Конструктор должен инициализировать текущее значение числа.

Методы add, sub и mul должны соответственно прибавлять, вычитать и домножать текущее значение на x и возвращать экземпляр класса.

Метод build должен возвращать текущее значение.

Формат выходных данных

Код решения должен содержать только класс Builder. Он не должен ничего выводить.

Примеры тестов

Стандартный вход Стандартный выход
1
new Builder(3).add(2).mul(5).build();
25

Задача 2A. Proxy

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Дан интерфейс MySet, реализующий множество целых чисел:


public interface MySet
{
  public void add(int x);
  public void remove(int x);
  public boolean contains(int x);
}

Напишите класс, реализующий шаблон проектирования Proxy. который позволяет добавлять элементы во множество, а также удалять только те элементы, которых не было во множестве на момент создания экземпляра Proxy.


public class Proxy implements MySet
{
  public Proxy(MySet init) { ... }
  ...
}

При попытке удалить несуществующий элемент или элемент, который присутствовал в момент создания класса, ничего не должно происходить.

Формат выходных данных

Код решения должен содержать только класс Proxy. Он не должен ничего выводить.


Задача 2B. Decorator

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Дан интерфейс StringTransformer, описывающий преобразование строки:


public interface StringTransformer
{
  public String apply(String s);
}

Напишите класс Decorator, содержащий классы Left и Right, реализующие шаблон проектирования Decorator. Результатом применения декоратора Left должно быть преобразование, добавляющее указанный префикс в начало строки. Результатом применения декоратора Right должно быть преобразование, добавляющее указанный суффикс в конец строки.


public class Decorator
{
  public static class Left implements StringTransformer {
    public Left(String prefix, StringTransformer orig) { ... }
    ...
  }
  public static class Right implements StringTransformer {
    public Right(String suffix, StringTransformer orig) { ... }
    ...
  }
}

Формат выходных данных

Код решения должен содержать только класс Decorator. Он не должен ничего выводить.


Задача 3A. Chain of FizzBuzz

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Дан интерфейс ChainLink, описывающий элемент цепочки ответственности:


public interface ChainLink {
  void setNextChain(ChainLink next);
  void apply(int x);
}

Напишите класс Chain, содержащий классы Fizz и Buzz, реализующие шаблон проектирования Chain of Responsibility. Результатом применения класса Fizz должен быть вывод в указанный PrintStream строки Fizz, если переданное число делится на 3. Результатом применения класса Buzz должен быть вывод в указанный PrintStream строки Buzz, если переданное число делится на 5.


public class Chain
{
  public class Fizz implements ChainLink {
    public Fizz(PrintStream ps) { ... }
    ...
  }
  public class Buzz implements ChainLink {
    public Buzz(PrintStream ps) { ... }
    ...
  }
}

Формат выходных данных

Код решения должен содержать только класс Chain. Он не должен ничего выводить.


Задача 3B. Observer

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Дан интерфейс Subscriber, описывающий подписку на событие:


public interface Subscriber {
  void notified(int topic, String message);
}

Напишите класс Notifier, реализующий шаблон проектирования Observer.


public class Notifier
{
  public void register(int topic, Subscriber s) { ... }
  public void unregister(int topic, Subscriber s) { ... }
  public void notify(int topic, String message) { ... }
}

Функция register должна подписывать обработчик на события определённой темы. Функция unregister должна отменять подписку обработчика на события определённой темы. Функция notify должна вызывать функции notified у всех обработчиков указанной темы в порядке, соответствующем порядку подписки.

Повторная подписка того же самого обработчика на одну и ту же тему должна перемещать его в конец очереди, определяющей порядок обработки. Отписка не подписанного обработчика должна ничего не делать.

Формат выходных данных

Код решения должен содержать только класс Notifier. Он не должен ничего выводить.


0.063s 0.003s 23