详解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