您的位置:首页 > 其它

Bridge Design Pattern

2013-01-10 20:31 281 查看
这篇博文是阅读老外写的博文后,自己参照了他的思想实现的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 类

如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: