1. Что такое паттерн Мост

1.1 Определение и концепция

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

1.2 Цель и эффект паттерна Мост

Основная цель паттерна Мост - разделить абстрактную часть от части реализации, чтобы они могли изменяться и расширяться независимо. Это достигается путем создания абстрактного мостового класса, связанного с конкретным классом реализации.

2. Характеристики и преимущества паттерна Мост

Некоторые основные характеристики и преимущества паттерна Мост включают в себя:

  • Улучшенная масштабируемость системы. Как абстракция, так и реализация могут независимо расширяться, не влияя друг на друга.
  • Соответствие принципу открытости/закрытости. Часть абстракции и часть реализации могут независимо расширяться, не влияя друг на друга.
  • Прозрачность деталей реализации для клиента, позволяющая скрыть детали реализации от пользователя.

3. Сценарии применения паттерна Мост

  • При необходимости разделить реализацию сложного объекта от его абстракции можно использовать паттерн Мост. Это может положительно сказаться на производительности существующего кода, особенно если программа использует только часть объекта во время выполнения.
  • Когда необходимо разделять специфические состояния реализации между несколькими объектами, но для клиентского кода они должны выглядеть как независимые классы.

4. Применение паттерна Мост в Golang

4.1 Введение в UML-диаграмму классов

Паттерн Мост в Golang

4.2 Подробные шаги реализации

4.2.1 Определение абстрактного интерфейса роли

Сначала мы определяем интерфейс DrawAPI, конкретный код выглядит следующим образом:

// Абстрактный интерфейс роли
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 Реализация конкретного класса роли

Затем мы определяем два класса, RedCircle и BlueCircle, которые реализуют методы интерфейса DrawAPI:

// Конкретный класс роли
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // логика рисования красного круга
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // логика рисования синего круга
}

4.2.3 Определение абстрактного интерфейса моста

Определите интерфейс Shape моста:

// Абстрактный интерфейс моста
type Shape interface {
	Draw()
}

4.2.4 Реализация конкретного класса моста

Реализуйте класс Circle, который реализует интерфейс Shape и содержит объект типа интерфейса DrawAPI:

// Конкретный класс моста
type Circle struct {
    x, y, radius int
    drawAPI      DrawAPI
}

func (c *Circle) Draw() {
    c.drawAPI.DrawACircle(c.radius, c.x, c.y)
}

4.2.5 Пример вызова клиента

func main() {
    redCircle := &Circle{100, 100, 10, new(RedCircle)}
    blueCircle := &Circle{100, 100, 10, new(BlueCircle)}

    redCircle.Draw()
    blueCircle.Draw()
}

Таким образом, мы реализовали паттерн Мост в Golang.