当前位置:首页 > PHP教程 > php面向对象 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2023-06-23 12:01:15 浏览: 评论:0 

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

适用场景

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

一个类存在2个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展

优点

解耦抽象和具体实现,方便增加抽象和实现。优秀的扩充能力

符合开闭原则和合成复用原则。

缺点

增加了系统的理解与设计难度。

需要正确地识别出系统中,两个独立变化的维度。

扩展

为什么要用桥接模式?

先说说继承:

如果有一个手机类作为父类A,下面有各个牌子的手机作为子类B,又有每个牌子手机旗下的内置应用类C。此时如果有3个手机的牌子,那么内置应用的父类可能有30个。

如果因为需求变需要增加手机品牌B,或者接着有第四层的D类继承第三层的内置应用类,想想这个是多么庞大的数量。后期难以维护。如果一旦父级发生变动,株连很多子类。

其实按照合成复用原则,也就是少用继承(强耦合),多用组合(弱耦合)或者聚合(中耦合)

以上的问题,可以直接拆分成两个大模块:

手机类作为抽象,手机牌子作为具体的类。

内置软件可单独抽象,每一个内置的软件作为具体的类。

然后让让两个抽象进行牵线搭桥,这边是桥接模式的思路。

案例代码

  1. abstract class Mobile { 
  2.     abstract public function operate(); 
  3. } 
  4. class HuaWei extends Mobile { 
  5.     public function operate() { 
  6.         echo '华为手机'; 
  7.     } 
  8. } 
  9. class Vivo extends Mobile { 
  10.     public function operate() { 
  11.         echo 'Vivo手机'; 
  12.     } 
  13. } 
  14. Abstract class Abstraction { 
  15.     protected $implementer; 
  16.     public function setImplementer ($implementer) { 
  17.         $this->implementer = $implementer; 
  18.     } 
  19.     public function run() { 
  20.         $this->implementer->operate(); 
  21.     } 
  22. } 
  23. class HuaWeiApp extends Abstraction { 
  24.     public function run() { 
  25.         $this->implementer->operate(); 
  26.     } 
  27. } 
  28. class VivoApp extends Abstraction { 
  29.     public function run() { 
  30.         $this->implementer->operate(); 
  31.     } 
  32. } 
  33. //调用端 
  34. $ab = new HuaWeiApp(); 
  35. $ab->setImplementer(new HuaWei); 
  36. $ab->run(); 
  37. $ab = new VivoApp(); 
  38. $ab->setImplementer(new Vivo); 
  39. $ab->run(); 

抽象代码

  1. //创建一个实现 
  2. abstract class Implementer { 
  3.     abstract public function operate(); 
  4. } 
  5. class ImplementerA extends Implementer { 
  6.     public function operate() { 
  7.         echo 'ImplementerA'; 
  8.     } 
  9. } 
  10. class ImplementerB extends Implementer { 
  11.     public function operate() { 
  12.         echo 'ImplementerB'; 
  13.     } 
  14. } 
  15. Abstract class Abstraction { 
  16.     protected $implementer; 
  17.     //用组合的方式替代继承 
  18.     public function setImplementer (Implementer $implementer) { 
  19.         $this->implementer = $implementer; 
  20.     } 
  21.     public function run() { 
  22.         $this->implementer->operate(); 
  23.     } 
  24. } 
  25. class RefinedAbstraction extends Abstraction { 
  26.     public function run() { 
  27.         $this->implementer->operate(); 
  28.     } 
  29. } 
  30. //调用端============================================================ 
  31. $ab = new RefinedAbstraction(); 
  32. $ab->setImplementer(new ImplementerA()); 
  33. $ab->run(); 
  34. $ab->setImplementer(new ImplementerB()); 
  35. $ab->run();

Tags: PHP设计模式 PHP桥接模式

分享到: