当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-20 16:56:27 浏览: 评论:0 

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

  1. interface Shape 
  2.  
  3.  
  4.     function fill (); 
  5.  
  6.  
  7.  
  8.  
  9. class circleShage implements Shape 
  10.  
  11.  
  12.     public function fill () 
  13.  
  14.     { 
  15.  
  16.         echo '圆形' . PHP_EOL; 
  17.  
  18.     } 
  19.  
  20.  
  21.  
  22.  
  23. class SquareShape implements Shape 
  24.  
  25.  
  26.     public function fill () 
  27.  
  28.     { 
  29.  
  30.         echo '正方形' . PHP_EOL; 
  31.  
  32.     } 
  33.  

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

  1. class RedCircleShage implements Shape 
  2.  
  3.  
  4.     public function fill () 
  5.  
  6.     { 
  7.  
  8.         echo '红色圆形' . PHP_EOL; 
  9.  
  10.     } 
  11.  
  12.  
  13.  
  14.  
  15. class RedSquareShape implements Shape 
  16.  
  17.  
  18.     public function fill () 
  19.  
  20.     { 
  21.  
  22.         echo '红色正方形' . PHP_EOL; 
  23.  
  24.     } 
  25.  
  26.  
  27.  
  28.  
  29. class BlueCircleShage implements Shape 
  30.  
  31.  
  32.     public function fill () 
  33.  
  34.     { 
  35.  
  36.         echo '蓝色圆形' . PHP_EOL; 
  37.  
  38.     } 
  39.  
  40.  
  41.  
  42.  
  43. class BlueSquareShape implements Shape 
  44.  
  45.  
  46.     public function fill () 
  47.  
  48.     { 
  49.  
  50.         echo '蓝色正方形' . PHP_EOL; 
  51.  
  52.     } 
  53.  

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

合成(组合)与聚合

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

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

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

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

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

桥接模式

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

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

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

  1. abstract class FShape 
  2.  
  3.  
  4.     protected $color = null; 
  5.  
  6.     public function __construct(IColor $color
  7.  
  8.     { 
  9.  
  10.         $this->color = $color
  11.  
  12.     } 
  13.  
  14.     public function shape () 
  15.  
  16.     { 
  17.  
  18.         echo $this->color->color() . $this->setShape() . PHP_EOL; 
  19.  
  20.     } 
  21.  
  22.     protected abstract function setShape (); 
  23.  
  24.  
  25.  
  26.  
  27. class CircleShape extends FShape 
  28.  
  29.  
  30.     protected function setShape () 
  31.  
  32.     { 
  33.  
  34.         return '圆形'
  35.  
  36.     } 
  37.  
  38.  
  39.  
  40.  
  41. class SquareShape extends FShape 
  42.  
  43.  
  44.     protected function setShape () 
  45.  
  46.     { 
  47.  
  48.         return '正方形'
  49.  
  50.     } 
  51.  
  52.  
  53.  
  54.  
  55. interface IColor 
  56.  
  57.  
  58.     public function color (); 
  59.  
  60.  
  61.  
  62.  
  63. class BlueColor implements IColor 
  64.  
  65.  
  66.     public function color () 
  67.  
  68.     { 
  69.  
  70.         return '蓝色'
  71.  
  72.     } 
  73.  
  74.  
  75.  
  76.  
  77. class RedColor implements IColor 
  78.  
  79.  
  80.     public function color () 
  81.  
  82.     { 
  83.  
  84.         return '红色'
  85.  
  86.     } 
  87.  

测试代码如下:

  1. $blueColor = new BlueColor(); 
  2.  
  3. $redColor = new RedColor(); 
  4.  
  5. $blueCircleShape = new CircleShape($blueColor); 
  6.  
  7. $redCircleShape = new CircleShape($redColor); 
  8.  
  9. $blueSquareShape = new SquareShape($blueColor); 
  10.  
  11. $redSquareShape = new SquareShape($redColor); 
  12.  
  13. $blueCircleShape->shape(); 
  14.  
  15. $redCircleShape->shape(); 
  16.  
  17. $blueSquareShape->shape(); 
  18.  
  19. $redSquareShape->shape(); 

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

Tags: php设计模式 php桥接模式

分享到: