浅谈PHP设计模式的桥接模式

yizhihongxing

简介:

桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏向组合和聚合的方式来共享。

适用场景:

不希望或不适用使用多继承的场景。
一个类存在2个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展

优点:

解耦抽象和具体实现,方便增加抽象和实现。优秀的扩充能力
符合开闭原则和合成复用原则。

缺点:

增加了系统的理解与设计难度。
需要正确地识别出系统中,两个独立变化的维度。

扩展:

为什么要用桥接模式?
先说说继承:
如果有一个手机类作为父类A,下面有各个牌子的手机作为子类B,又有每个牌子手机旗下的内置应用类C。此时如果有3个手机的牌子,那么内置应用的父类可能有30个。
如果因为需求变需要增加手机品牌B,或者接着有第四层的D类继承第三层的内置应用类,想想这个是多么庞大的数量。后期难以维护。如果一旦父级发生变动,株连很多子类。
其实按照合成复用原则,也就是少用继承(强耦合),多用组合(弱耦合)或者聚合(中耦合)
以上的问题,可以直接拆分成两个大模块:
手机类作为抽象,手机牌子作为具体的类。
内置软件可单独抽象,每一个内置的软件作为具体的类。
然后让让两个抽象进行牵线搭桥,这边是桥接模式的思路。

案例代码:

abstract class Mobile {
    abstract public function operate();
}

class HuaWei extends Mobile {
    public function operate() {
        echo '华为手机';
    }
}

class Vivo extends Mobile {
    public function operate() {
        echo 'Vivo手机';
    }
}


Abstract class Abstraction {
    protected $implementer;
    public function setImplementer ($implementer) {
        $this->implementer = $implementer;
    }

    public function run() {
        $this->implementer->operate();
    }
}


class HuaWeiApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}

class VivoApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}


//调用端
$ab = new HuaWeiApp();
$ab->setImplementer(new HuaWei);
$ab->run();

$ab = new VivoApp();
$ab->setImplementer(new Vivo);
$ab->run();

抽象代码:

//创建一个实现
abstract class Implementer {
    abstract public function operate();
}

class ImplementerA extends Implementer {
    public function operate() {
        echo 'ImplementerA';
    }
}

class ImplementerB extends Implementer {
    public function operate() {
        echo 'ImplementerB';
    }
}


Abstract class Abstraction {
    protected $implementer;
    //用组合的方式替代继承
    public function setImplementer (Implementer $implementer) {
        $this->implementer = $implementer;
    }

    public function run() {
        $this->implementer->operate();
    }
}

class RefinedAbstraction extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}

//调用端============================================================
$ab = new RefinedAbstraction();
$ab->setImplementer(new ImplementerA());
$ab->run();

$ab->setImplementer(new ImplementerB());
$ab->run();

原文链接:https://www.cnblogs.com/phpphp/p/16864740.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的桥接模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • PHP读写文件的方法(生成HTML)

    关于“PHP读写文件的方法(生成HTML)”的攻略,我可以给出以下步骤和示例说明。 1. 文件读取 PHP提供了多种方法读取文件,例如: 1.1 file_get_contents() file_get_contents()函数用于将整个文件读入字符串。 $file = ‘example.txt’; $content = file_get_contents(…

    PHP 2023年5月26日
    00
  • php 截取字符串并以零补齐str_pad() 函数

    PHP中的str_pad()函数可以截取给定字符串的一部分,并在所截取的字符串前面添加零或其他字符,以将其的长度补齐。 该函数的语法格式如下: str_pad($str, $pad_len, $pad_str = "0", $pad_type = STR_PAD_RIGHT) 其中,$str为需要被处理的字符串,$pad_len为补齐后的…

    PHP 2023年5月26日
    00
  • smarty模板中拼接字符串的方法

    当smarty模板需要编写需要动态生成的字符串时,我们可以使用smarty的字符串拼接方法,具体步骤如下: 步骤一:使用字符串拼接方法 在smarty中,可以使用”.”(点)或者”cat”函数进行字符串的拼接,如下所示: {$var1.’ ‘.$var2|cat:’ – ‘} {*或*} {cat:$var1:’ – ‘:$var2} 上述代码中,”var1…

    PHP 2023年5月29日
    00
  • ID中如何使用插件编辑数学公式?InDesign中的数学公式插件用法

    在InDesign中,我们可以使用MathTools这个数学公式插件来编辑数学公式。下面是具体的操作流程。 步骤一:安装MathTools插件 首先,我们需要将MathTools插件安装到InDesign中。插件的安装方法为,在InDesign中点击“菜单栏 > 编辑 > 首选项 > 常规”打开常规设置窗口,在该窗口内点击“插件”选项卡,在…

    PHP 2023年5月26日
    00
  • PHP实现简单爬虫的方法

    下面我来详细讲解一下在PHP中实现简单爬虫的方法。 1. 爬虫原理 爬虫是一种自动化的数据抓取程序,实现简单的爬虫需要了解如下基本步骤: 获取需要抓取的网页内容,可以使用Curl或file_get_contents等函数来获取; 解析网页内容,提取所需信息,可以使用正则表达式或XPath等方式; 把抓取到的数据进行处理,最后存储在数据库或文本文件中。 下面我…

    PHP 2023年5月23日
    00
  • 微信小程序之页面拦截器的示例代码

    下面是“微信小程序之页面拦截器的示例代码”完整攻略。 什么是拦截器? 拦截器是一种机制,在请求到达后台之前,可以对请求进行处理,如根据请求头进行数据过滤或拦截等操作。在小程序中,我们可以使用页面拦截器来实现类似的功能。 如何使用页面拦截器? 首先,在app.js里面设置页面拦截器: App({ onLaunch: function() { // 设置页面拦截…

    PHP 2023年5月23日
    00
  • PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】

    PHP在InnoDB引擎下快速代建全文搜索功能简明教程【基于Xunsearch】 全文搜索是许多网站必备的一个功能,对于搜索引擎、新闻、博客等网站具有很大的作用。在使用MySQL作为数据库引擎的时候,我们可以通过全文索引来实现全文搜索。但是,在InnoDB引擎下,MySQL的全文索引只能支持英文搜索,对于中文或者其他非英文的搜索则无能为力。那么如何解决这个问…

    PHP 2023年5月26日
    00
  • PHP简单装饰器模式实现与用法示例

    下面我将为你详细讲解“PHP简单装饰器模式实现与用法示例”的完整攻略。 PHP简单装饰器模式实现与用法示例 一、什么是装饰器模式 装饰器模式(Decorator Pattern)是一种设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它允许通过添加函数封装来动态改变对象的行为。 二、装饰器模式的实现 在 PH…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部