学习php桥接模式心得及案例代码分享,有哪些经验可以交流?

更新于
2026-09-27 14:36:20
1阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计905个文字,预计阅读时间需要4分钟。

学习php桥接模式心得及案例代码分享,有哪些经验可以交流?

假设您有一个形状类(Shape),目前它扩展了两个子类:圆形和正方形。以下是对给定代码的简化修改,确保没有冗余,并且不超过100个字:

phpinterface Shape { function fill(); }class Circle implements Shape { public function fill() { echo 圆形; } }class Square implements Shape { public function fill() { echo 正方形; } }

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

interface Shape { function fill (); } class circleShage implements Shape { public function fill () { echo '圆形' . PHP_EOL; } } class SquareShape implements Shape { public function fill () { echo '正方形' . PHP_EOL; } }

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

class RedCircleShage implements Shape { public function fill () { echo '红色圆形' . PHP_EOL; } } class RedSquareShape implements Shape { public function fill () { echo '红色正方形' . PHP_EOL; } } class BlueCircleShage implements Shape { public function fill () { echo '蓝色圆形' . PHP_EOL; } } class BlueSquareShape implements Shape { public function fill () { echo '蓝色正方形' . PHP_EOL; } }

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

合成(组合)与聚合

学习php桥接模式心得及案例代码分享,有哪些经验可以交流?

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

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

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

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

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

桥接模式

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

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

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

abstract class FShape { protected $color = null; public function __construct(IColor $color) { $this->color = $color; } public function shape () { echo $this->color->color() . $this->setShape() . PHP_EOL; } protected abstract function setShape (); } class CircleShape extends FShape { protected function setShape () { return '圆形'; } } class SquareShape extends FShape { protected function setShape () { return '正方形'; } } interface IColor { public function color (); } class BlueColor implements IColor { public function color () { return '蓝色'; } } class RedColor implements IColor { public function color () { return '红色'; } }

测试代码如下:

$blueColor = new BlueColor(); $redColor = new RedColor(); $blueCircleShape = new CircleShape($blueColor); $redCircleShape = new CircleShape($redColor); $blueSquareShape = new SquareShape($blueColor); $redSquareShape = new SquareShape($redColor); $blueCircleShape->shape(); $redCircleShape->shape(); $blueSquareShape->shape(); $redSquareShape->shape();

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

学习

本文共计905个文字,预计阅读时间需要4分钟。

学习php桥接模式心得及案例代码分享,有哪些经验可以交流?

假设您有一个形状类(Shape),目前它扩展了两个子类:圆形和正方形。以下是对给定代码的简化修改,确保没有冗余,并且不超过100个字:

phpinterface Shape { function fill(); }class Circle implements Shape { public function fill() { echo 圆形; } }class Square implements Shape { public function fill() { echo 正方形; } }

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

interface Shape { function fill (); } class circleShage implements Shape { public function fill () { echo '圆形' . PHP_EOL; } } class SquareShape implements Shape { public function fill () { echo '正方形' . PHP_EOL; } }

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

class RedCircleShage implements Shape { public function fill () { echo '红色圆形' . PHP_EOL; } } class RedSquareShape implements Shape { public function fill () { echo '红色正方形' . PHP_EOL; } } class BlueCircleShage implements Shape { public function fill () { echo '蓝色圆形' . PHP_EOL; } } class BlueSquareShape implements Shape { public function fill () { echo '蓝色正方形' . PHP_EOL; } }

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

合成(组合)与聚合

学习php桥接模式心得及案例代码分享,有哪些经验可以交流?

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

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

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

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

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

桥接模式

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

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

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

abstract class FShape { protected $color = null; public function __construct(IColor $color) { $this->color = $color; } public function shape () { echo $this->color->color() . $this->setShape() . PHP_EOL; } protected abstract function setShape (); } class CircleShape extends FShape { protected function setShape () { return '圆形'; } } class SquareShape extends FShape { protected function setShape () { return '正方形'; } } interface IColor { public function color (); } class BlueColor implements IColor { public function color () { return '蓝色'; } } class RedColor implements IColor { public function color () { return '红色'; } }

测试代码如下:

$blueColor = new BlueColor(); $redColor = new RedColor(); $blueCircleShape = new CircleShape($blueColor); $redCircleShape = new CircleShape($redColor); $blueSquareShape = new SquareShape($blueColor); $redSquareShape = new SquareShape($redColor); $blueCircleShape->shape(); $redCircleShape->shape(); $blueSquareShape->shape(); $redSquareShape->shape();

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

学习