资讯专栏INFORMATION COLUMN

PHP设计模式(八)桥接模式(Bridge For PHP)

K_B_Z / 2182人阅读

摘要:桥接设计模式桥接模式将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果。模拟企业分组发送短信需求公司现在需要按分组临时工正式工管理层等以多种形式微博等给员工发送通知。

桥接设计模式

桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果。

案例 模拟毛笔

需求:现在需要准备三种粗细(大中小),并且有五种颜色的比

如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。

实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。即将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法多带带变化,使得只有创建15种对象才能完成任务。而毛笔与颜料能够很好的脱耦(比和颜色是分开的),抽象层面的概念是:"毛笔用颜料作画",每个参与者(毛笔与颜料)都可以在自己的自由度上随意转换。

Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。

模拟企业分组发送短信

需求:公司现在需要按分组(临时工、正式工、管理层等)以多种形式(QQ、Email、微博等)给员工发送通知。

适用性

类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。通过使用Bridge模式对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

不希望在抽象和它的实现部分之间有一个固定的绑定关系。

一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。

效果

Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。

所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同员工组和不同信息发送模式。

Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

实现 员工分组
abstract class Staff
{
    abstract public function staffData();
}

class CommonStaff extends Staff
{
    public function staffData()
    {
        return "小名,小红,小黑";
    }
}

class VipStaff extends Staff
{
    public function staffData()
    {
        return "小星、小龙";
    }
}
发送形式
// 抽象父类
abstract class SendType
{
    abstract public function send($to, $content);
}

class QQSend extends SendType
{
    public function __construct()
    {
        // 与QQ接口连接方式
    }

    public function send($to, $content)
    {
        return $content. "(To ". $to . " From QQ)
"; } }
class SendInfo
{
    protected $_level;
    protected $_method;

    public function __construct($level, $method)
    {
        //  这里可以使用单例控制资源的消耗
        $this->_level = $level;
        $this->_method = $method;
    }

    public function sending($content)
    {
        $staffArr = $this->_level->staffData();
        $result = $this->_method->send($staffArr, $content);
        echo $result;
    }
}
客户端调用
$info = new SendInfo(new VipStaff(), new QQSend());
$info->sending( "回家吃饭");

$info = new SendInfo(new CommonStaff(), new QQSend());
$info->sending( "继续上班");
输出结果
回家吃饭(To 小星、小龙 From QQ)
继续上班(To 小名,小红,小黑 From QQ)
总结
从上面可以看出,如果增加分组或者是发送信息的类型,都可以直接创建一个类,来拓展,十分方便。

但是Bridge模式虽然是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31693.html

相关文章

  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • 听飞狐聊JavaScript设计模式系列11

    摘要:桥接模式之特权函数特权函数,用一些具有特权的方法作为桥梁以便访问私有空间,可以回忆一下之前的系列。连续自然数分组,计算最多组的个数将至这个连续自然数分成组使每组相加的值相等。个数组中数字最多的一组有个此时的和为。 本回内容介绍 上一回,聊了适配器模式,图片预加载,介一回,聊桥接模式(Bridge),跟之前一样,难度比较小,桥接模式将抽象部分与它的实现部分分离,通过桥接模式联系彼此,同时...

    wanglu1209 评论0 收藏0
  • PHP设计模式(十):适配器模式

    摘要:原文地址设计模式十适配器模式在设计模式七设计模式分类中我们提到过结构设计模式,结构设计模式专注于设计对象和实例的构建组合过程。适配器模式在不修改现有代码的基础上,保留了架构。 原文地址:PHP设计模式(十):适配器模式 Introduction 在PHP设计模式(七):设计模式分类中我们提到过结构设计模式(Structural patterns),结构设计模式专注于设计对象(Objec...

    paney129 评论0 收藏0
  • 一起学设计模式 - 桥接模式

    摘要:桥接模式属于结构型模式的一种,用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。相关模式装饰模式与桥接模式在一定程度上都是为了减少子类的数目,避免出现复杂的继承关系。 桥接模式(Brideg Pattern)属于结构型模式的一种,用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解...

    tinysun1234 评论0 收藏0

发表评论

0条评论

K_B_Z

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<