github地址:https://github.com/ZQCard/design_pattern
/** * 桥接模式 * 优点: * 1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。 * 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。 * 3、实现细节对客户透明,可以对用户隐藏实现细节。 * 缺点: * 1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 * 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。 * * 例子: 形状和颜色 各种颜色的形状进行组合,如果进行多层继承,添加一个颜色或者形状会增加很多类 */
(1) Color.class.php(颜色接口,用户规范子类实现)
<?php namespace Bridge; interface Color { public function paint($shape); }
(2)Gray.class.php(灰色子类)
<?php namespace Bridge; class Gray implements Color { public function paint($shape) { var_dump("灰色的".$shape); echo '<br/>'; } }
(3)Black.class.php(黑色子类)
<?php namespace Bridge; class Black implements Color { public function paint($shape) { var_dump("黑色的".$shape); echo '<br/>'; } }
(4)Shape.class.php 形状抽象父类(公共设置方法和规范子类实现)
<?php namespace Bridge; abstract class Shape { protected $color; public function setColor(Color $color) { $this->color = $color; } public abstract function draw(); }
(5)Circle.class.php(圆形子类)
<?php namespace Bridge; class Circle extends Shape { public function draw() { $this->color->paint('圆形'); } }
(6)Rectangle.class.php(长方形子类)
<?php namespace Bridge; class Rectangle extends Shape { public function draw() { $this->color->paint('长方形'); } }
(7)Square.class.php
<?php namespace Bridge; class Square extends Shape { public function draw() { $this->color->paint('正方形'); } }
(8)brige.php
<?php spl_autoload_register(function ($className){ $className = str_replace('\','/',$className); include $className.".class.php"; }); use BridgeWhite; use BridgeSquare; use BridgeRectangle; $white = new White(); $square = new Square(); $square->setColor($white); $square->draw(); $rectangle = new Rectangle(); $rectangle->setColor($white); $rectangle->draw();