JavaRush /Java блог /Random /Кофе-брейк #202. Паттерн проектирования Bridge в Java. Ка...

Кофе-брейк #202. Паттерн проектирования Bridge в Java. Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each

Статья из группы Random

Паттерн проектирования Bridge в Java

Источник: Medium Благодаря этой публикации вы узнаете о преимуществах и способе применения паттерна проектирования Bridge на конкретной реализации в Java. Кофе-брейк #202. Паттерн проектирования Bridge в Java. Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each - 1Паттерн (шаблон) Bridge — это структурный шаблон проектирования, обеспечивающий принцип разделения ответственности при реализации. Этот шаблон является как бы мостом между реализацией и абстракцией, который разделяет, но также соединяет их. Они становятся независимыми друг от друга, а точкой соединения между ними в кодовой базе является Bridge.

Преимущества паттерна проектирования Bridge

  • Разделяет уровни абстракции и реализации.
  • Обеспечивает принцип разделения обязанностей (ответственности).
  • Поддерживает легкое расширение, поскольку эти слои становятся независимыми друг от друга.
  • Скрывает детали реализации от стороны клиента.
Теперь давайте рассмотрим пример реализации паттерна проектирования Builder. Вы можете найти весь упомянутый ниже код с другими примерами в моем репозитории на GitHub. Реализация, которая отображает возраст автомобиля в соответствии с годом его выпуска, довольно проста. Она нам нужна, чтобы продемонстрировать, как использовать шаблон Bridge. Для начала давайте реализуем класс интерфейса с именем Vehicle.

package service;

public interface Vehicle {
  int getAge();
  String getModel();
}
Затем кодируем класс service, который реализует предыдущий интерфейс и имеет два конкретных атрибута, связанных с транспортным средством: factoryYear и model.

package impl;

import service.Vehicle;

import java.util.Calendar;

public class VehicleImpl implements Vehicle {

  private int manufactureYear;
  private String model;

  public VehicleImpl(int manufactureYear, String model) {
    this.manufactureYear = manufactureYear;
    this.model = model;
  }

  @Override
  public int getAge() {
    return Calendar.getInstance().get(Calendar.YEAR) - this.manufactureYear;
  }

  @Override
  public String getModel() {
    return this.model;
  }
}
Теперь пришло время реализовать наш bridge-класс под названием VehicleManager. Этот класс имеет класс интерфейса в качестве атрибута для доступа к реализованным в нем методам.

package bridge;

import service.Vehicle;

public class VehicleManager {

  public Vehicle vehicle;

  public int getAge() {
    return this.vehicle.getAge();
  }

  public String getModel() {
    return this.vehicle.getModel();
  }
}
Наконец, давайте воспользуемся нашим классом bridge для очень простой реализации. Пользователю предлагается ввести модель автомобиля и год выпуска. С помощью класса bridge наш интерфейс и классы реализации абстрагируются, также через этот класс рассчитывается возраст автомобиля.

import bridge.VehicleManager;
import impl.VehicleImpl;

import java.util.Scanner;

public class BridgeDesignPattern {
  public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    System.out.print("Enter the model of your vehicle: ");
    final String model = scanner.next();
    System.out.print("Enter the manufacture year of your vehicle: ");
    final int manufactureYear = scanner.nextInt();

    scanner.close();

    VehicleManager vehicleManager = new VehicleManager();
    vehicleManager.vehicle = new VehicleImpl(manufactureYear, model);
    System.out.println(String.format("Your %s is %d years old !!!", vehicleManager.getModel(), vehicleManager.getAge()));
  }
}
Результат исполненного приложения можно увидеть ниже. Кофе-брейк #202. Паттерн проектирования Bridge в Java. Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each - 2

Подведем итоги

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

Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each

Источник: FreeCodeCamp В этом руководстве вы изучите особенности работы с циклом for-each (расширенный цикл for) в Java на примере массивов. Кофе-брейк #202. Паттерн проектирования Bridge в Java. Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each - 3Вы можете использовать расширенные циклы в Java для достижения тех же результатов, что и циклы for. Расширенный цикл в языке Java также известен как цикл for-each. Расширенные циклы упрощают создание циклов for. В основном они используются для перебора массива или набора переменных.

Синтаксис цикла for-each в Java

Вот как выглядит синтаксис цикла for-each в Java:

for(dataType variable : array) {
    // блок кода для выполнения
}
Что мы видим в этом примере:
  • vdataType обозначает тип данных массива.
  • variable (переменная) обозначает переменную, присваиваемую каждому элементу массива во время итерации (вы лучше поймете это на следующих примерах).
  • array (массив) обозначает массив, через который нужно выполнить цикл.

Пример цикла for-each в Java

Давайте рассмотрим несколько примеров, которые помогут вам понять, как работает цикл for-each. Пример первый:

class ForEachExample {
    public static void main(String[] args) {
        
        int[] even_numbers = { 2, 4, 6, 8 };
        
        for(int number : even_numbers){
           System.out.println(number);
           // 2
           // 4
           // 6
           // 8
        }
        
    }
}
В приведенном выше коде мы создали массив с именем even_numbers. Чтобы просмотреть и напечатать все числа в массиве, мы использовали цикл for-each: for(int number : even_numbers){...}. В скобках для цикла мы создали целочисленную (integer) переменную с именем number, которая будет использоваться для цикла с массивом even_numbers. Далее мы получили: Итерация №1 number = первый элемент массива (2). Результат распечатывается. Итерация №2 number = второй элемент массива (4). Это текущее значение распечатывается. Итерация №3 number = третий элемент массива (6). Это текущее значение распечатывается. Итерация №4 number = четвертый элемент массива (8). Это текущее значение также распечатывается. Значение number продолжает меняться на текущий индекс в процессе итерации, пока не дойдет до конца массива. После того, как каждый индекс распечатан, он переходит к следующему индексу. Теперь взглянем на еще один пример цикла for-each в Java:

class ForEachExample {
    public static void main(String[] args) {
        
        int[] even_numbers = { 2, 4, 6, 8 };
        
        for(int number : even_numbers){
            number = number*2;
            System.out.println(number);
        }
        
    }
}
В показанном выше коде мы умножаем значение каждого элемента на два, используя переменную number: number = number*2;. Процесс здесь такой же, как и в последнем примере. Когда number становится элементом массива, он удваивает значение элемента и выводит его на консоль.

Заключение

Вы можете использовать циклы for-each в Java для перебора элементов массива или коллекции. Они упрощают создание циклов for. Например, синтаксис цикла for требует, чтобы вы создали переменную — условие, указывающее, когда цикл должен завершиться, а также значение увеличения/уменьшения. В циклах for-each все, что вам нужно, это переменная и массив, через который нужно выполнить цикл. Но это не значит, что вы всегда должны использовать только for-each. Не стоит забывать, что циклы for дают вам больший контроль над тем, что происходит во время процесса итерации — вы можете отслеживать, что происходит с каждым индексом или некоторыми индексами. С другой стороны, циклы for-each лучше использовать, когда вам не нужно отслеживать каждый индекс. Здесь код просто выполняется для каждого элемента в массиве. Удачного кодирования!
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ