Мост — это структурный паттерн проектирования, который разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
При частом изменении класса преимущества объектно-ориентированного подхода становятся очень полезными, позволяя делать изменения в программе, обладая минимальными сведениями о реализации программы. Шаблон мост является полезным там, где часто меняется не только сам класс, но и то, что он делает.
Диаграмма UML
Пример на PHP
trait TData { private $data; public function __construct(array $data) { $this->data = $data; $this->prepare(); } abstract protected function prepare(); } trait TShow { private $content; public function show() { print $this->content; } } class XmlFormat { use TData, TShow; protected function prepare() { $this->content = ''; foreach ($this->data as $name => $item) { $this->content .= "<$name>$item"; } $this->content .= ''; } } class JsonFormat { use TData, TShow; protected function prepare() { $this->content = json_encode($this->data); } } class SelfFormat { use TData, TShow; protected function prepare() { $content = array(); foreach ($this->data as $name => $item) { $string = ''; if (is_string($name)) { $nLen = strlen($name); $string .= "[name|string({$nLen}){{$name}}:val|"; } if (is_int($name)) { $string .= "[index|int{{$name}}:val|"; } if (is_string($item)) { $vLen = strlen($item); $string .= "string($vLen){{$item}"; } if (is_int($item)) { $string .= "int{{$item}"; } $string .= "}]"; array_push($content, $string); } $this->content = 'selfMadeDataFormat:Array('.count($this->data).'):'; $this->content .= implode(',', $content); $this->content .= ':endSelfMadeDataFormat'; } } $xml = new XmlFormat(array('a' => 'b', 'c')); $json = new JsonFormat(array('a' => 'b', 'c')); $self = new SelfFormat(array('a' => 'b', 'c')); $self->show(); /* selfMadeDataFormat:Array(2):[name|string(1){a}:val|string(1){b}],[index|int{0}:val|string(1){c}]:endSelfMadeDataFormat */ $xml->show(); /* b<0>c */ $json->show(); /* {"a":"b","0":"c"} */