bridge

package
v0.0.0-...-6db54d9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 15, 2021 License: MIT Imports: 0 Imported by: 0

README

Мост (Bridge)

Паттерн Bridge относится к структурным паттернам уровня объекта.

Паттерн Bridge позволяет разделить объект на абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга.

Если для одной абстракции возможно несколько реализаций, то обычно используют наследование. Однако такой подход не всегда удобен, так как наследование жестко привязывает реализацию к абстракции, что затрудняет независимую модификацию и усложняет их повторное использование.

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

Я не нашел не одного адекватного описания паттерна "Мост". Все что мне встречалось, либо не соответствует действительности и примеры высосаны из пальца или очень размыты. Из того, что я понял и могу объяснить на пальцах - Мост это хитрая агрегация. Класс реализующий изделие, реализует интерфейс агрегируемого класса, который подсовывается на этапе создания экземпляра класса изделия.

Как я понял... у нас есть 3 машины и 3 разных двигателя. Каждый двигатель подходит к каждой машине, т.е. она реализует его интерфейс. Если делать это наследованием, мы получим 9 разных классом. Получается у каждой машины 3 модификации. Это неудобно, поэтому мы будем подсовывать двигатель на этапе создания машины. Так же каждый двигатель, может работать на разном топливе, дизель или бензин, что бы не плодить 6 разных реализаций, при создании двигателя мы будем подсовывать в него тип топлива.

Для реализации паттерна в этом примере необходимо в базовом классе автомобилей добавить поле для хранения указателя на тип реализации, значение которого класс будет получать в своём конструкторе, и вызывать по необходимости методы вложенного объекта.

Требуется для реализации:

  1. Базовый абстрактный класс (в нашем случаем описывающий автомобиль);
  2. Класс реализующий базовый класс. В нем есть свойство в которое мы будем подсовывать указатель на используемый двигатель (машина может работать с любым из представленных двигателей);
  3. Абстракция двигателя;
  4. Реализация двигателя.

В общем свойство хранящее указатель на используемый объект и есть мост. Мы в него можем подсовывать разные объекты, главное, что бы они имели одинаковый интерфейс.

[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go заместо общепринятого наследования используется агрегирование и встраивание.

-- THE END --

Documentation

Overview

Package bridge is an example of the Bridge Pattern.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Car

type Car struct {
	// contains filtered or unexported fields
}

Car implementation.

func (*Car) Rase

func (c *Car) Rase() string

Rase implementation.

type Carer

type Carer interface {
	Rase() string
}

Carer provides car interface.

func NewCar

func NewCar(engine Enginer) Carer

NewCar is the Car constructor.

type EngineHonda

type EngineHonda struct {
}

EngineHonda implements Honda engine.

func (*EngineHonda) GetSound

func (e *EngineHonda) GetSound() string

GetSound returns sound of the engine.

type EngineLada

type EngineLada struct {
}

EngineLada implements Lada engine.

func (*EngineLada) GetSound

func (e *EngineLada) GetSound() string

GetSound returns sound of the engine.

type EngineSuzuki

type EngineSuzuki struct {
}

EngineSuzuki implements Suzuki engine.

func (*EngineSuzuki) GetSound

func (e *EngineSuzuki) GetSound() string

GetSound returns sound of the engine.

type Enginer

type Enginer interface {
	GetSound() string
}

Enginer provides engine interface.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL