PHP设计模式—桥接模式
程序员文章站
2022-03-03 09:48:53
定义: 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。 结构: Abstraction:抽象类。 RefindAbstraction:被提炼的抽象类。 Implementor:实现类。 ConcreteImplementor:具体实现类 。 Client:客户端代码 ......
定义:
桥接模式(bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
结构:
- abstraction:抽象类。
- refindabstraction:被提炼的抽象类。
- implementor:实现类。
- concreteimplementor:具体实现类 。
- client:客户端代码。
代码实例:
接下来用代码实现一个颜色组合的例子,有三种颜色:黑、白、红,三种形状:圆形、正方形、长方形,可以*组合。在这个例子中abstraction表示形状,refindabstraction表示圆形、正方形、长方形,implementor表示颜色,concreteimplementor表示黑、白、红。
/** * 颜色抽象类 * class colour */ abstract class colour { /** * @return mixed */ abstract public function run(); } /** * 黑色 * class black */ class black extends colour { public function run() { // todo: implement run() method. return '黑色'; } } /** * 白色 * class white */ class white extends colour { public function run() { // todo: implement run() method. return '白色'; } } /** * 红色 * class red */ class red extends colour { public function run() { // todo: implement run() method. return '红色'; } } /** * 形状抽象类 * class shape */ abstract class shape { /** * 颜色 * @var colour */ protected $colour; /** * shape constructor. * @param colour $colour */ public function __construct(colour $colour) { $this->colour = $colour; } /** * @return mixed */ abstract public function operation(); } /** * 圆形 * class round */ class round extends shape { /** * @return mixed|void */ public function operation() { // todo: implement operation() method. echo $this->colour->run() . '圆形<br>'; } } /** * 长方形 * class rectangle */ class rectangle extends shape { /** * @return mixed|void */ public function operation() { // todo: implement operation() method. echo $this->colour->run() . '长方形<br>'; } } /** * 正方形 * class square */ class square extends shape { /** * @return mixed|void */ public function operation() { // todo: implement operation() method. echo $this->colour->run() . '正方形<br>'; } } // 客户端代码 // 白色圆形 $whiteround = new round(new white()); $whiteround->operation(); // 黑色正方形 $blacksquare = new square(new black()); $blacksquare->operation(); // 红色长方形 $redrectangle = new rectangle(new red()); $redrectangle->operation(); // 运行结果 白色圆形 黑色正方形 红色长方形
总结:
- 桥接模式分离抽象接口及其实现部分,实现解耦,相比继承而言,无疑是一个更好的解决方案。
- 方便扩展,桥接模式相比继承而言更加灵活,减少创建类的同时还方便组合。
- 对于两个独立变化的维度,可以使用桥接模式。