首页 后端开发 php教程 php设计模式:桥接模式学习心得(附案例代码)

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

Aug 03, 2020 pm 04:54 PM
桥接模式

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

interface Shape

{

    function fill ();

}

 

class circleShage implements Shape

{

    public function fill ()

    {

        echo '圆形' . PHP_EOL;

    }

}

 

class SquareShape implements Shape

{

    public function fill ()

    {

        echo '正方形' . PHP_EOL;

    }

}

登录后复制

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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个子类(类爆炸),那么有没有什么好的办法来解决呢?

合成(组合)与聚合

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

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

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

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

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

桥接模式

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

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 '红色';

    }

}

登录后复制

测试代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

$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();

登录后复制

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

学习推荐:

php视频教程

mysql视频教程

以上是php设计模式:桥接模式学习心得(附案例代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

11个最佳PHP URL缩短脚本(免费和高级) 11个最佳PHP URL缩短脚本(免费和高级) Mar 03, 2025 am 10:49 AM

11个最佳PHP URL缩短脚本(免费和高级)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

在Laravel中使用Flash会话数据

Instagram API简介 Instagram API简介 Mar 02, 2025 am 09:32 AM

Instagram API简介

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

简化的HTTP响应在Laravel测试中模拟了

构建具有Laravel后端的React应用程序:第2部分,React 构建具有Laravel后端的React应用程序:第2部分,React Mar 04, 2025 am 09:33 AM

构建具有Laravel后端的React应用程序:第2部分,React

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

php中的卷曲:如何在REST API中使用PHP卷曲扩展

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

在Codecanyon上的12个最佳PHP聊天脚本

Laravel中的通知 Laravel中的通知 Mar 04, 2025 am 09:22 AM

Laravel中的通知

See all articles