Skip to content

Instantly share code, notes, and snippets.

@AlexGalhardo
Created August 22, 2019 19:50
Show Gist options
  • Select an option

  • Save AlexGalhardo/f49e786183f5f950e7ba8ffd7f74f991 to your computer and use it in GitHub Desktop.

Select an option

Save AlexGalhardo/f49e786183f5f950e7ba8ffd7f74f991 to your computer and use it in GitHub Desktop.
  • Bridge é um padrão de projeto de software, ou design pattern em inglês, utilizado quando é desejável que uma interface (abstração) possa variar independentemente das suas implementações.
  • Imagine um sistema gráfico de janelas que deve ser portável para diversas plataformas. Neste sistema são encontrados diversos tipos de janelas, como ícones, diálogos, etc. Estas janelas formam uma hierarquia que contém uma abstração das janelas (classe base). Normalmente, a portabilidade seria obtida criando-se especializações dos tipos de janelas para cada uma das plataformas suportadas. O problema com essa solução reside na complexidade da hierarquia gerada e na dependência de plataforma que existirá nos clientes do sistema.
  • Através do padrão Bridge, a hierarquia que define os tipos de janelas é separada da hierarquia que contém a implementação. Desta forma todas as operações de Janela são abstratas e suas implementações são escondidas dos clientes.
  • O diagrama mostra a solução para o problema citado. Temos duas hierarquias de classes relacionadas: a hierarquia de tipos de janelas (Janela, Ícone e Dialogo) e a de implementação nas plataformas suportadas (JanelaImpl, XWindowImpl e MSWindowImpl). O relacionamento entre as interfaces, Janela e JanelaImpl, é a "ponte" que "desacopla" a interface da implementação. Para que um ícone seja desenhado, faz-se uma chamada ao método DesenhaBorda() que por sua vez realiza "n" chamadas ao método DesenhaLinha() da classe XWindowImpl ou MSWindowImpl, dependendo da plataforma desejada.
  • bridge

Exemplo em PHP

<?php

interface APIDesenho {
	public function desenharCirculo($x, $y, $radius);
}

class APIDesenho1 implements APIDesenho {
	public function desenharCirculo($x, $y, $radius){
		echo "Desenhando Circulo, v1: " . $x . '- ' . $y . '-' . $radius;
	}
}

class APIDesenho2 implements APIDesenho {
	public function desenharCirculo($x, $y, $radius){
		echo "Desenhando Circulo, v2: " . $x . '- ' . $y . '-' . $radius;
	}
}

abstract class Forma {

	protected $api;
	protected $x;
	protected $y;
	public function __construct(APIDesenho $api){
		$this->api = $api;
	}
}

class Circulo extends Forma {
	protected $radio;
	public function __construct($x, $y, $radius, APIDesenho $api){
		parent::__construct($api);
		$this->x = $x;
		$this->y = $y;
		$this->radio = $radius;
	}
	public function desenhar(){
		$this->api->desenharCirculo($this->x, $this->y, $this->radio);
	}
}

/**
 * Crio uma ponte na minha classe normal, 
 * mandando uma classe para a classe abstract pai desta classe normal
 * deste modo, consigo desacoplar a classe abstract
 */
$circulo = new Circulo(1, 3, 7, new APIDesenho1());
$circulo->desenhar();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment