PHP 设计模式 九
桥接模式
桥接模式是结构型设计模式,核心思想是:将抽象与实现分离,使它们可以独立变化,通过「桥接」组合关系,替代传统的继承关系,解决多维度变化导致的类爆炸问题。
实现化接口 A实现化类 B抽象化抽象类 C抽象化类 D
$obj = D(B);$obj->function();
应用场景
| | | | |
|---|
| | | 发送渠道:短信、邮件、钉钉、微信公众号、APP 推送 | 可自由组合;新增消息类型 / 渠道互不影响,避免普通短信、紧急邮件等大量子类 |
| | 支付场景:APP 支付、H5 支付、小程序支付、PC 收银台 | | 解耦场景与支付通道,新增通道只加一个类,不用重复写各场景适配代码 |
| | 日志级别 / 类型:Debug、Info、Warn、Error、业务日志 | 日志存储方式:本地文件、MySQL、Redis、阿里云日志、ES | 自由搭配:Error 存数据库、Info 存文件;扩展存储驱动不改动日志业务 |
| | | | |
| | | | 任一控制方式可操控任一设备,新增设备不用适配所有遥控器 |
| | | | 业务与格式解耦,新增格式只需实现驱动,不用改每个业务导出逻辑 |
| | | 访问终端:PC 后台、APP、小程序、第三方 API | 角色与终端权限逻辑分离,新增终端只需适配权限桥接层 |
| | | | 模板业务和短信厂商解耦,切换 / 新增厂商无需修改模板逻辑 |
代码是实现
以后台权限为例,包括用户权限菜单和权限角色。
实现化接口:用户权限菜单接口
interfaceTerminalInterface{// 获取当前终端可访问的菜单publicfunctiongetMenu(): array;}
实现化类
//PC端classPcTerminalimplementsTerminalInterface{publicfunctiongetMenu(): array{return ['首页', '用户管理', '订单管理', '系统设置', '数据统计']; }}//APP端classAppTerminalimplementsTerminalInterface{publicfunctiongetMenu(): array{return ['首页', '用户管理', '订单管理']; }}
抽象化抽象类:角色象类
abstractclassAbstractRole{// 持有终端引用 == 桥接的桥protected TerminalInterface $terminal;publicfunction__construct(TerminalInterface $terminal){$this->terminal = $terminal; }// 抽象方法:获取当前角色在对应终端的权限abstractpublicfunctiongetAuthMenu($roleid): array;}
抽象化类
//PC管理员classPCAdminRoleextendsAbstractRole{publicfunctiongetAuthMenu($roleid): array{return$this->terminal->getMenu($roleid); }}//PC用户classPCUserRoleextendsAbstractRole{publicfunctiongetAuthMenu($roleid): array{return$this->terminal->getMenu($roleid); }}//app用户:普通会员classAppCommonMemberRoleextendsAbstractRole{publicfunctiongetAuthMenu($roleid): array{return$this->terminal->getMenu($roleid); }}
调用
$userinfo = [];$roleid =$userinfo['roleid'];$ter = new PcTerminal();$role = new PCAdminRole($ter);$menu = $role->getAuthMenu($roleid);