Паттерн проектирования Bridge в Java
Источник:
Medium
Благодаря этой публикации вы узнаете о преимуществах и способе применения паттерна проектирования Bridge на конкретной реализации в Java.
Паттерн (шаблон) 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()));
}
}
Результат исполненного приложения можно увидеть ниже.
Подведем итоги
Паттерн проектирования Bridge используется для разделения обязанностей между уровнями абстракции и реализации в кодовой базе. Это структурный шаблон проектирования, который обеспечивает независимость между этими двумя уровнями. Он имеет функциональность, которая помогает нам легко расширять наши уровни абстракции и реализации, поскольку они разделены этим мостом, но при этом соединение все еще существует, поскольку класс Bridge является связующим звеном между ними.
Как использовать циклы for-each в массивах. Где стоит применять цикл for, а где for-each
Источник:
FreeCodeCamp
В этом руководстве вы изучите особенности работы с циклом for-each (расширенный цикл for) в Java на примере массивов.
Вы можете использовать расширенные циклы в 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 лучше использовать, когда вам не нужно отслеживать каждый индекс. Здесь код просто выполняется для каждого элемента в массиве.
Удачного кодирования!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ