网络编程
位置:首页>> 网络编程>> php编程>> 详解PHP设计模式之桥接模式

详解PHP设计模式之桥接模式

作者:程序员-南  发布时间:2023-05-30 10:29:02 

标签:PHP,桥接模式,设计模式

简介

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

适用场景

不希望或不适用使用多继承的场景。

一个类存在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://blog.csdn.net/qq_42342282/article/details/127729526

0
投稿

猜你喜欢

  • 不久之前,笔者一个在企业中从事网管工作的朋友向我求助关于SQL Server服务器内存升级后遇到的问题。原来,他们企业准备上一个企业邮箱系统
  • 文章主要描述的是SQL Server到DB2连接服务器的正确实现过程,以及对其在实际操作中所要用到的实际操作环境的描述,以下就是对SQL S
  • 主键表的主键(primary key,主关键字)是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录。一个表不能有多个主关键字,并且
  • 今天要处理通知书上的日期,写的一个处理程序,效率可能不是最优的,不过实现功能绝对没问题。注:月份和天要分>10,=10,<10三
  • 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数
  • 今天在 经纬 同学blog看到的。有这么一段代码:<ul id="demo"><li>
  • 在网站开发的时候经常要用chr(),但本人比较懒没时间记那么多。于是到用到的时候就查,这样麻烦。现在将它写出来方便以后用到查,也方便大家!c
  • 一直以来,我们大多使用js来实现弹出菜单,可是根据 w3c 的css标准,根本就没有这个必要。只需要简单得使用css+html就可以做出一个
  • 1、页签的表达。页签表达很清晰,当前页签突出,且层级包涵关系明确;看下图,一目了然的感觉,不用疑惑我在那部分里。不信?拿当当的对比一下,你感
  • 以下的文章主要是介绍MySQL5创建存储过程的实例演示,MySQL5创建存储在实际操作中应用的频率还是很高的,以下就是MySQL5创建存储过
  • 听说 FaceBook 开放其网站的代码了,期前也算是了解过 FaceBook 的架构,所以重点就是看其代码的质量。可以毫不夸张的说,Fac
  • 传统的HTML页面中连动下拉框采用了两种方法:1)直接将下拉框中的内容hardcode于html的javascript中,调用javascr
  • 当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管是来自同
  • 在ASP中,除了ADODB、Scripting 等一些常用组件外,我们还可以用微软的ActiveX方法来轻松捕获哟: <%u
  • 设计师在抱怨开发人员不尊重Web标准,后台开发人员在抱怨为什么不可以增加一个空格。PM在抱怨为什么项目总是因为那些看似简单的问题而延期……如
  • 在Web标准中一个很重要的概念就是强调页面的结构与表现分离。说的通俗一点就是XHTML中应该没有样式化的东西,而且Web在浏览器中除内容外都
  • 图片缩放会失真是真理,在浏览器里也一样,貌似使用传说中的双三次插值可以让失真看起来比较不明显,但是真的想不通IE7已经实现了,却不默认打开,
  • 在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。我前段时间写
  • reflow是个神奇的东西,之前Realazy说到过这个reflow,我摘出其中的重点:在CSS规范中有一个渲染对象的概念,通常用一个盒子(
  • 测试语法如下:powered by jb51.netexec GetRecordFromPage news,newsid,10,100000
手机版 网络编程 asp之家 www.aspxhome.com