Мост шаблонов Java Design Patterns (7)

Java задняя часть Шаблоны проектирования дизайн

Введение

Темой этой статьи является второй паттерн структурного паттерна — паттерн моста. Предыдущая тема 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("华硕笔记本电脑");

    }

}

Вышеприведенный код реализует структуру компьютерной классификации на рисунке посредством наследования. Однако есть несколько проблем с использованием наследования:

  1. Проблема масштабируемости: если вы добавляете новую категорию планшетов, вам нужно добавить N подкатегорий брендов. Если добавляется бренд Sony, другие категории компьютеров также должны добавлять соответствующие подкатегории.

  2. Нарушение принципа единой ответственности: добавление нового типа или нового бренда приведет к изменению структуры каталогов уровня 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 представлена ​​следующим образом: