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

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

简介

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

适用场景

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

一个类存在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

标签:PHP,桥接模式,设计模式
0
投稿

猜你喜欢

  • pytorch中的广播语义

    2023-04-22 15:16:36
  • js格式化金额可选是否带千分位以及保留精度

    2023-10-06 04:03:14
  • Ubuntu安装Go语言运行环境

    2024-03-09 11:06:15
  • echarts自定义饼图数据刷新和颜色渲染问题浅析

    2024-04-29 13:21:15
  • Python类的高级函数详解

    2022-11-21 04:59:18
  • 深入理解Golang Channel 的底层结构

    2024-02-18 19:29:13
  • JavaScript中利用各种循环进行遍历的方式总结

    2024-04-17 10:10:36
  • MySQL中slave_exec_mode参数详解

    2024-01-18 07:36:34
  • 解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码

    2011-06-06 10:29:00
  • Python写的服务监控程序实例

    2022-09-01 13:12:31
  • Python配置文件解析模块ConfigParser使用实例

    2023-10-19 09:10:19
  • Python实现多态、协议和鸭子类型的代码详解

    2021-03-16 19:02:35
  • 详解js根据百度地图提供经纬度计算两点距离

    2024-04-29 13:40:51
  • Golang+Vue轻松构建Web应用的方法步骤

    2024-05-29 22:06:42
  • Python爬虫采集微博视频数据

    2023-08-11 16:01:03
  • 基于JS实现动态跟随特效的示例代码

    2023-06-30 11:15:16
  • OpenCV 图像分割实现Kmean聚类的示例代码

    2023-08-10 18:59:41
  • Python中的Numpy入门教程

    2023-04-10 06:59:10
  • 解决Python 使用h5py加载文件,看不到keys()的问题

    2021-10-04 06:19:15
  • 一个基于flask的web应用诞生 flask和mysql相连(4)

    2024-01-18 20:37:16
  • asp之家 网络编程 m.aspxhome.com