[PHP语言] php设计模式:桥接模式学习心得(附案例代码)

[复制链接]
查看2231 | 回复6 | 2020-10-31 15:09:34 | 显示全部楼层 |阅读模式
假如你有一个形状类(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个子类(类爆炸),那么有没有什么好的办法来解决呢?

合成(组合)与聚合

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

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

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

聚合:表示一种整体与部分的关系(弱关系),表示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();

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

学习推荐:

php视频教程

mysql视频教程

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

  • 微信
  • 分享
  • 相关标签:桥接模式
  • 本文原创发布爱上源码网,转载请注明出处,感谢您的尊重!
    • 上一篇:掌握PHP 爬取网页的主要方法
    • 下一篇:使用注册树及工厂模式来替代使用单例模式实践(附案例)

    相关文章

    相关视频

    • PHP设计模式之 桥接模式
    • PHP桥接模式详解及案例
    • 一文读懂简单工厂、工厂方法、抽象工厂
    • 一文读懂php设计模式之代理模式
    • php设计模式:桥接模式学习心得(附案例代码)
    • 自定义实现JS中最简单的事件设计模式
    • 单例设计模式
    • 继续单例设计模式
    • ThinkPHP5.1中用到的设计模式
    本文有爱上源码下载完入驻作者发布,如果对您版权造成侵害,可以联系本站站长管理进行维权删除,本站收到维权24小时内进行处理,谢谢您关注23ym.cn! 本站分享大量程序员技术文章以及对编程开发的初级入门教程,包括图文讲解笔记和高清视频下载~
    回复

    使用道具 举报

    千无情实 | 2020-12-2 15:09:03 | 显示全部楼层
    站长真良心,这么大的资源站都是免费下载
    回复

    使用道具 举报

    mzbua44 | 2021-1-14 07:09:36 | 显示全部楼层
    祝愿悟空源码越办越好!
    回复

    使用道具 举报

    fys24680 | 2021-1-29 12:13:10 | 显示全部楼层
    我是来白嫖资源的!
    回复

    使用道具 举报

    成功源于创新蠢 | 2021-2-12 13:28:50 | 显示全部楼层
    站长真良心,这么大的资源站都是免费下载
    回复

    使用道具 举报

    音乐之家1 | 2021-2-15 21:50:15 | 显示全部楼层
    悟空源码太厉害,资源真多!
    回复

    使用道具 举报

    也空中最亮的兴 | 2021-3-14 07:55:05 | 显示全部楼层
    我是来白嫖资源的!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则