Введение
Темой этой статьи является второй паттерн структурного паттерна — паттерн моста. Предыдущая тема Java Design Patterns была«Шаблон адаптера шаблонов проектирования Java (6)».
2. Краткое введение
# 2.1 Определение
Шаблон моста является одним из шаблонов структурного проектирования. Шаблон моста основан на минимальном принципе проектирования классов с использованием таких поведений, как инкапсуляция, агрегация и наследование, чтобы разные классы брали на себя разные обязанности. Его основной особенностью является разделение абстракции и реализации, чтобы можно было сохранить независимость каждой части и рассмотреть их функциональные расширения.
# 2.2 Сценарии применения
Обрабатывайте многоуровневые структуры наследования и сценарии с многомерными изменениями. Каждое измерение спроектировано как независимая структура наследования, поэтому каждое измерение можно расширять независимо.
3. Метод реализации
Возьмем в качестве примера компьютер.В интернет-магазине мы можем увидеть меню классификации компьютера.Структура классификации показана на следующем рисунке:
На рисунке структура компьютера разделена на три уровня: первый уровень — это название продукта (компьютер), второй уровень — классификация типов компьютеров, а третий уровень — классификация брендов. Теперь давайте попробуем реализовать структуру рисунка выше с помощью кода:
public interface Computer {
void info();
}
class Desktop implements Computer {
@Override
public void info() {
System.out.println("台式电脑!");
}
}
class Laptop implements Computer {
@Override
public void info() {
System.out.println("笔记本电脑!");
}
}
class LenovoDesktop extends Desktop {
@Override
public void info() {
System.out.println("联想台式电脑");
}
}
class AsusDesktop extends Desktop {
@Override
public void info() {
System.out.println("华硕台式电脑");
}
}
class LenovoLaptop extends Laptop {
@Override
public void info() {
System.out.println("联想笔记本电脑");
}
}
class AsusLaptop extends Laptop {
@Override
public void info() {
System.out.println("华硕笔记本电脑");
}
}
Вышеприведенный код реализует структуру компьютерной классификации на рисунке посредством наследования. Однако есть несколько проблем с использованием наследования:
-
Проблема масштабируемости: если вы добавляете новую категорию планшетов, вам нужно добавить N подкатегорий брендов. Если добавляется бренд Sony, другие категории компьютеров также должны добавлять соответствующие подкатегории.
-
Нарушение принципа единой ответственности: добавление нового типа или нового бренда приведет к изменению структуры каталогов уровня 3.
Ниже мы используем режим моста для решения вышеуказанной проблемы:
Мы классифицируем их по 2 измерениям и разделяем независимо друг от друга, то есть разделяем тип компьютера и марку компьютера.
Размер бренда:
public interface Brand {
void info();
}
class LenovoBrand implements Brand {
@Override
public void info() {
System.out.println("联想");
}
}
class AsusBrand implements Brand {
@Override
public void info() {
System.out.println("华硕");
}
}
Размер типа:
public abstract class Computer {
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info() {
this.brand.info();
}
}
class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
public void info() {
super.info();
System.out.println("台式电脑");
}
}
class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
public void info() {
super.info();
System.out.println("笔记本电脑");
}
}
Клиент:
public class Client {
public static void main(String[] args) {
Computer computer = new Desktop(new LenovoBrand());
computer.info();
}
}
Результат печатает:
联想
台式电脑
Когда мы изменяем код в одном измерении, это не влияет на код в другом измерении, поэтому соблюдается принцип единой ответственности, и структура кода становится гибкой.
Диаграмма классов UML представлена следующим образом: