Bridge Design Pattern

这篇博文是阅读老外写的博文后,自己参照了他的思想实现的PHP版本。若有不足,请善意指正。原文链接。

请看如下的图片:

   

        吊扇和灯泡,2个电子设备。

  

                      2个开关,一个普通的,一个时尚的。

开关可以用来控制电子设备的开和关。不管你用普通的开关还是时尚的开关,它都能控制电子设备的开关。

或许这是废话,可很多事情都是从简单的概念开始的,比如我们学英文,先从26个字母开始,然后学习单词,等我们积累了一定单词的时候,我们利用各种介词和连接词把单词拼接在一起形成有意义的句子, I want(动词) to(介词) learn programming.

如果你需要着手写作一本书的话,你需要把它拆分成章节,每个章节又细分为小节,每个小节的内容和写作技巧可能又有些不同。每个章节可能有内容的交叉,也有内容的延续和深入。

可这些跟编程有关系吗?  

答案是有的,这26个单词就相当于OOP的那些基本概念。我开始把那些常用的操作打包成自己的类库,在每个相似地场景运用它们。那是我学会了如何写小作文了。我已经掌握了大部分单词的写法,也能根据一定规则把它们组合在一起,形成有意义地句子。

可如果我想写本书,还有很多东西等待我去学习和练习。

言归正传,回到开关这个话题。是的,开关和电子设备是通过电子线路连接的,所以不管是时尚的开关或普通的开关,都能开关电灯。在编程的世界里,我们需要抽象这些概念,我们需要一个虚拟地电子线路来连接虚拟地电子设备和虚拟地开关。我画了个图来说明:

 Fan 风扇  Light 灯

我定义了一个抽象的接口 IElectrinicalEquipment , 含有2个方法,开,关。

Fan,Light 继承IElectrinicalEquipment 接口。

还有一个抽象类 Switch(代码中ElectrinicalSwitch)

NomalSwitch,FancySwitch 继承了这个抽象类的方法。

等等,这些是什么呢? 看代码吧。

<?php
/**
 * 
 * 电子设备的基本功能接口
 * 所有设备都能开关
 *
 */
interface IElectrinicalEquipment
{
    public function PowerOn();
    public function PowerOff();
}

/**
 * 
 * 电子设备的开关抽象类
 * 实现的有点SB
 * 原作者是使用JAVA实现的,实现方法不是很懂。
 * todo:优化
 */
abstract class ElectrinicalSwitch
{
    public $bridge = null;
    
    function On(){
        $this->bridge->PowerOn();
    }
    function Off(){
        $this->bridge->PowerOff();
    }
}

/**
 * 
 * 2个具体开关类继承开关抽象类
 * 没有方法,简单
 *
 */
class FancySwitch extends ElectrinicalSwitch
{
}

class NomalSwitch extends ElectrinicalSwitch
{
}

/**
 * 
 * 风扇类
 *
 */
class fan implements IElectrinicalEquipment
{
    public function PowerOn()
    {
        echo __CLASS__." switch on equipment<br />";
    }
    
    public function PowerOff()
    {
        echo __CLASS__." switch off equipment<br />";
    }
}

/**
 *
 * 灯类
 *
 */
class light implements IElectrinicalEquipment
{
    public function PowerOn()
    {
        echo __CLASS__." switch on equipment<br />";
    }

    public function PowerOff()
    {
        echo __CLASS__." switch off equipment<br />";
    }
}

$fan = new fan(); // 创建一个风扇
$light = new light(); // 创建一个灯

$nomal = new NomalSwitch(); // 创建一个普通开关
$nomal->bridge = $fan;    // 将普通开关连上风扇
$nomal->On();           // 打开风扇

// 你可以自己控制试试
?>

是不是很简单,学习这个模式的优点很多:

  • It teaches how to think abstract, which is the key concept of all Object Oriented Design Patterns.
  • It implements the basic OOD principles.
  • It is easy to understand.
  • If this pattern is understood correctly, learning other Design Patterns becomes easy.

翻译过来就是:

1. 它教会我们如何去思考抽象这个面向对象设计的最重要的概念。

2.它实施了最基本的面向对象设计的原则。

3.它非常容易理解。

4.如果你理解了这个设计模式,学习其他的设计模式会变得很容易。

附上作者的原UML模式图:

Here, Abstraction is the base Switch class. RefinedAbstraction is the specific switch classes (FancySwitch,NormalSwitch etc.). Implementor is the IElectricalEquipment interface. ConcreteImplementorA andConcreteImplementorB are the Fan and Light classes.

这个模式图与代码中类的对应关系:

Abstraction --------- ElectrinicalSwitch 

RefinedAbstraction ---------- FancySwitch,NormalSwitch 等.

Implementor ------- IElectricalEquipment

ConcreteImplementorA andConcreteImplementorB -------- Fan and Light 类

如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。

原文地址:https://www.cnblogs.com/arist/p/2855362.html