浅谈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();
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析