当前位置:Gxlcms > PHP教程 > php设计模式:桥接模式学习心得(附案例代码)

php设计模式:桥接模式学习心得(附案例代码)

时间:2021-07-01 10:21:17 帮助过:25人阅读

假如你有一个形状类(Shape),目前它扩展出了两个子类,圆形类和正方形类。伪代码如下:

  1. interface Shape
  2. {
  3. function fill ();
  4. }
  5. class circleShage implements Shape
  6. {
  7. public function fill ()
  8. {
  9. echo '圆形' . PHP_EOL;
  10. }
  11. }
  12. class SquareShape implements Shape
  13. {
  14. public function fill ()
  15. {
  16. echo '正方形' . PHP_EOL;
  17. }
  18. }

现在你想给形状增加颜色——红色、蓝色。那么,你应该如何做,如果用继承的思想,那么就需要写出四个类,分别如下:

  1. class RedCircleShage implements Shape
  2. {
  3. public function fill ()
  4. {
  5. echo '红色圆形' . PHP_EOL;
  6. }
  7. }
  8. class RedSquareShape implements Shape
  9. {
  10. public function fill ()
  11. {
  12. echo '红色正方形' . PHP_EOL;
  13. }
  14. }
  15. class BlueCircleShage implements Shape
  16. {
  17. public function fill ()
  18. {
  19. echo '蓝色圆形' . PHP_EOL;
  20. }
  21. }
  22. class BlueSquareShape implements Shape
  23. {
  24. public function fill ()
  25. {
  26. echo '蓝色正方形' . PHP_EOL;
  27. }
  28. }

但现在如果我想加入新的形状——三角形,新的颜色——黑色以及白色。那么我们就需要12个子类(类爆炸),那么有没有什么好的办法来解决呢?

合成(组合)与聚合

解决上述问题前,我们想理解合成与聚合的含义。

合成聚合原则:尽量使用合成/聚合,尽量不要使用继承。

合成(组合):表示一种整体与部分的关系(强关系),它们具有相同的生命周期,比如人和心脏的关系,心脏是人的一部分。

聚合:表示一种整体与部分的关系(弱关系),表示A对象可以包含B对象,但B对象并不是A对象的一部分。比如,我们上面所说的形状和颜色,形状可以包含颜色,但颜色并不是形状的一部分。

桥接模式,就是使用聚合来对系统进行解耦的。

桥接模式

定义:将抽象部分与它的实现分离,使他们可以独立的变化

上面的定义很难理解,用我们上面的例子就是,一个系统可能有多个角度分类(颜色、形状),每一种分类都可能有变化(新增新的形状和颜色),那么我们就可以用多个角度将系统的实现分离出来,降低他们之间的耦合。

那么如何来实现呢?下面是实现代码:

  1. abstract class FShape
  2. {
  3. protected $color = null;
  4. public function __construct(IColor $color)
  5. {
  6. $this->color = $color;
  7. }
  8. public function shape ()
  9. {
  10. echo $this->color->color() . $this->setShape() . PHP_EOL;
  11. }
  12. protected abstract function setShape ();
  13. }
  14. class CircleShape extends FShape
  15. {
  16. protected function setShape ()
  17. {
  18. return '圆形';
  19. }
  20. }
  21. class SquareShape extends FShape
  22. {
  23. protected function setShape ()
  24. {
  25. return '正方形';
  26. }
  27. }
  28. interface IColor
  29. {
  30. public function color ();
  31. }
  32. class BlueColor implements IColor
  33. {
  34. public function color ()
  35. {
  36. return '蓝色';
  37. }
  38. }
  39. class RedColor implements IColor
  40. {
  41. public function color ()
  42. {
  43. return '红色';
  44. }
  45. }

测试代码如下:

  1. $blueColor = new BlueColor();
  2. $redColor = new RedColor();
  3. $blueCircleShape = new CircleShape($blueColor);
  4. $redCircleShape = new CircleShape($redColor);
  5. $blueSquareShape = new SquareShape($blueColor);
  6. $redSquareShape = new SquareShape($redColor);
  7. $blueCircleShape->shape();
  8. $redCircleShape->shape();
  9. $blueSquareShape->shape();
  10. $redSquareShape->shape();

使用桥接模式后,我们的代码就符合了“开闭原则”, 当有新的形状或颜色加入时,我们只需要添加新的类即可。而不用去修改之前的类。

学习推荐:

php视频教程

mysql视频教程

以上就是php设计模式:桥接模式学习心得(附案例代码)的详细内容,更多请关注gxlcms其它相关文章!

人气教程排行