前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php设计模式(九):桥接模式(Bridge)

php设计模式(九):桥接模式(Bridge)

作者头像
陈大剩博客
发布2023-04-27 14:33:32
2860
发布2023-04-27 14:33:32
举报

桥接模式

又称:Bridge。桥接是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。

问题

前面说的:抽象? 实现? 听上去很高大尚? 假如有一个 台式电脑机箱(Case) 类,从它能扩展出三个子 类: 普通机箱(DefaultCase)海景房机箱(SeascapeCase)异形机箱(AlienCase)。然后我们希望对这样的类层次结构进行扩展以使其包含颜色, 所以打算创建名为 黑色(Black)、白色(White) 、 透明(Transparent) 的颜色子类。 但是, 由于已有三个子类,所以总共需要创建 九个 类才能覆盖所有组合, 例如:黑色异形机箱(BlackCase) 和 **白色异形机箱(WhiteCase)**。

问题
问题

在层次结构中新增形状和颜色将导致代码复杂程度指数增长。例如添加 紫色,你需要新增 三个子类,也就是每种颜色 一个; 此后新增一种新颜色需要新增 三个子类, 即每种形状 一个。一直这么下去,情况会越来越难受。

解决方法

通过将 继承改为组合 的方式来解决这个问题。 具体来说,就是 抽取其中一个维度 并使之成为 独立的类层次,这样就可以在初始类中引用这个 新层次的对象,从而使得一个类不必拥有所有的状态和行为

可以将颜色相关的代码抽取到拥有 黑色白色透明 三个子类的颜色类中,然后在 机箱 类中添加一个 指向某一颜色对象的引用成员变量。 机箱类可以将所 有与颜色相关的工作委派给连入的颜色对象。 这样的引用就 成为了 机箱颜色 之间的桥梁。

桥接模式
桥接模式

结构

CaseAbstract:抽象类 在本示例中指 机箱; DefaultCase、SeascapeCase、AlienCase:扩充抽象类 在本示例中指 普通机箱、海景房机箱、异形机箱; ColorInterface:实现类 在本示例中指 颜色; Black、White、Transparent:具体实现类 在本示例中指黑色、白色、透明

代码示例

抽象类(机箱)

代码语言:javascript
复制
abstract class CaseAbstract
{
    /**
     * 颜色
     * @var \cxbdasheng\DesignPatterns\Bridge\ColorInterface
     */
    protected $color;

    /**
     * 运行机箱
     * @return mixed
     * @author chendashengpc
     */
    abstract public function run();

    /**
     * 默认颜色
     * @param \cxbdasheng\DesignPatterns\Bridge\ColorInterface $color
     */
    public function __construct(ColorInterface $color)
    {
        $this->color = $color;
    }

}

接口实现类

代码语言:javascript
复制
interface ColorInterface
{
    public function getInfo();
}

具体产品类(机箱)

代码语言:javascript
复制
/**
 *
 * 普通机箱
 */
class DefaultCase extends CaseAbstract
{
    public function run()
    {
        return $this->color->getInfo() . '普通机箱';
    }
}

/**
 *
 * 海景房机箱
 */
class SeascapeCase extends CaseAbstract
{
    public function run()
    {
        return $this->color->getInfo() . '海景房机箱';
    }
}

/**
 *
 * 异形机箱
 */
class AlienCase extends CaseAbstract
{
    public function run()
    {
        return $this->color->getInfo() . '异形机箱';
    }
}

具体的实现类(颜色)

代码语言:javascript
复制
class Black implements ColorInterface
{
    public function getInfo()
    {
        return '黑色';
    }
}

class White implements ColorInterface
{
    public function getInfo()
    {
        return '白色';
    }
}
class Transparent implements ColorInterface
{
    public function getInfo()
    {
        return '透明';
    }
}

客户端使用

代码语言:javascript
复制
$black = new Black();
$white = new  White();
$transparent = new  Transparent();

$blackAlienCase = new AlienCase($black);
echo $blackAlienCase->run() . PHP_EOL;

$whiteAlienCase = new AlienCase($white);
echo $whiteAlienCase->run() . PHP_EOL;

$transparentAlienCase = new AlienCase($transparent);
echo $transparentAlienCase->run() . PHP_EOL;

echo PHP_EOL;

$blackSeascapeCase = new SeascapeCase($black);
echo $blackSeascapeCase->run() . PHP_EOL;

$whiteSeascapeCase = new SeascapeCase($white);
echo $whiteSeascapeCase->run() . PHP_EOL;

$transparentSeascapeCase = new SeascapeCase($transparent);
echo $transparentSeascapeCase->run() . PHP_EOL;

输出

代码语言:javascript
复制
黑色异形机箱
白色异形机箱
透明异形机箱

黑色海景房机箱
白色海景房机箱
透明海景房机箱

黑色普通机箱
白色普通机箱
透明普通机箱

UML

桥接模式UML
桥接模式UML

优缺点

优点

  • 可以创建与平台无关的类和程序
  • 客户端代码只与高层抽象部分进行互动,不会触及到详细信息。
  • 开闭原则。新增抽象部分和实现部分,且它们之间不会相互影响。
  • 单一职责。抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

缺点

  • 高内聚会使得桥接模式代码更加复杂

从代码可以发现跟上篇文章的 适配器模式 有点像,都是聚合让两个类配合工作,但是适配器是为了让已有的两个类互相兼容,而桥接模式则是为了让抽象和实现解耦,在减少创建类的同时还可以方便组合功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 桥接模式
  • 问题
  • 解决方法
  • 结构
  • 代码示例
    • 抽象类(机箱)
      • 接口实现类
        • 具体产品类(机箱)
          • 具体的实现类(颜色)
            • 客户端使用
            • UML
            • 优缺点
              • 优点
                • 缺点
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档