Bridge Design Pattern
2013-01-10 20:31
281 查看
这篇博文是阅读老外写的博文后,自己参照了他的思想实现的PHP版本。若有不足,请善意指正。原文链接。
请看如下的图片:
![](http://images.cnitblog.com/blog/408785/201301/10192954-e68b1c59a4524c54aebbc51560692bef.jpg)
![](http://images.cnitblog.com/blog/408785/201301/10193002-2701b6493744432d82d665419d4b1c9e.jpg)
吊扇和灯泡,2个电子设备。
![](http://images.cnitblog.com/blog/408785/201301/10193049-dea51460784f4704adceda1429718564.jpg)
![](http://images.cnitblog.com/blog/408785/201301/10193107-f77a232147aa413893bf240fb81a7ef5.jpg)
2个开关,一个普通的,一个时尚的。
开关可以用来控制电子设备的开和关。不管你用普通的开关还是时尚的开关,它都能控制电子设备的开关。
或许这是废话,可很多事情都是从简单的概念开始的,比如我们学英文,先从26个字母开始,然后学习单词,等我们积累了一定单词的时候,我们利用各种介词和连接词把单词拼接在一起形成有意义的句子, I want(动词) to(介词) learn programming.
如果你需要着手写作一本书的话,你需要把它拆分成章节,每个章节又细分为小节,每个小节的内容和写作技巧可能又有些不同。每个章节可能有内容的交叉,也有内容的延续和深入。
可这些跟编程有关系吗?
答案是有的,这26个单词就相当于OOP的那些基本概念。我开始把那些常用的操作打包成自己的类库,在每个相似地场景运用它们。那是我学会了如何写小作文了。我已经掌握了大部分单词的写法,也能根据一定规则把它们组合在一起,形成有意义地句子。
可如果我想写本书,还有很多东西等待我去学习和练习。
言归正传,回到开关这个话题。是的,开关和电子设备是通过电子线路连接的,所以不管是时尚的开关或普通的开关,都能开关电灯。在编程的世界里,我们需要抽象这些概念,我们需要一个虚拟地电子线路来连接虚拟地电子设备和虚拟地开关。我画了个图来说明:
![](http://images.cnitblog.com/blog/408785/201301/10200441-53ef4ca759934c549f20c943977b195f.png)
Fan 风扇 Light 灯
我定义了一个抽象的接口 IElectrinicalEquipment , 含有2个方法,开,关。
Fan,Light 继承IElectrinicalEquipment 接口。
还有一个抽象类 Switch(代码中ElectrinicalSwitch)
NomalSwitch,FancySwitch 继承了这个抽象类的方法。
等等,这些是什么呢? 看代码吧。
是不是很简单,学习这个模式的优点很多:
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模式图:
![](http://images.cnitblog.com/blog/408785/201301/10202434-8664a65eaf614e27abfea6371309a690.gif)
Here, Abstraction is the base
这个模式图与代码中类的对应关系:
Abstraction --------- ElectrinicalSwitch
RefinedAbstraction ----------
Implementor ------- IElectricalEquipment
ConcreteImplementorA andConcreteImplementorB -------- Fan and Light 类
如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。
请看如下的图片:
![](http://images.cnitblog.com/blog/408785/201301/10192954-e68b1c59a4524c54aebbc51560692bef.jpg)
![](http://images.cnitblog.com/blog/408785/201301/10193002-2701b6493744432d82d665419d4b1c9e.jpg)
吊扇和灯泡,2个电子设备。
![](http://images.cnitblog.com/blog/408785/201301/10193049-dea51460784f4704adceda1429718564.jpg)
![](http://images.cnitblog.com/blog/408785/201301/10193107-f77a232147aa413893bf240fb81a7ef5.jpg)
2个开关,一个普通的,一个时尚的。
开关可以用来控制电子设备的开和关。不管你用普通的开关还是时尚的开关,它都能控制电子设备的开关。
或许这是废话,可很多事情都是从简单的概念开始的,比如我们学英文,先从26个字母开始,然后学习单词,等我们积累了一定单词的时候,我们利用各种介词和连接词把单词拼接在一起形成有意义的句子, I want(动词) to(介词) learn programming.
如果你需要着手写作一本书的话,你需要把它拆分成章节,每个章节又细分为小节,每个小节的内容和写作技巧可能又有些不同。每个章节可能有内容的交叉,也有内容的延续和深入。
可这些跟编程有关系吗?
答案是有的,这26个单词就相当于OOP的那些基本概念。我开始把那些常用的操作打包成自己的类库,在每个相似地场景运用它们。那是我学会了如何写小作文了。我已经掌握了大部分单词的写法,也能根据一定规则把它们组合在一起,形成有意义地句子。
可如果我想写本书,还有很多东西等待我去学习和练习。
言归正传,回到开关这个话题。是的,开关和电子设备是通过电子线路连接的,所以不管是时尚的开关或普通的开关,都能开关电灯。在编程的世界里,我们需要抽象这些概念,我们需要一个虚拟地电子线路来连接虚拟地电子设备和虚拟地开关。我画了个图来说明:
![](http://images.cnitblog.com/blog/408785/201301/10200441-53ef4ca759934c549f20c943977b195f.png)
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模式图:
![](http://images.cnitblog.com/blog/408785/201301/10202434-8664a65eaf614e27abfea6371309a690.gif)
Here, Abstraction is the base
Switchclass. RefinedAbstraction is the specific switch classes (
FancySwitch,
NormalSwitchetc.). Implementor is the
IElectricalEquipmentinterface. ConcreteImplementorA andConcreteImplementorB are the
Fanand
Lightclasses.
这个模式图与代码中类的对应关系:
Abstraction --------- ElectrinicalSwitch
RefinedAbstraction ----------
FancySwitch,
NormalSwitch等.
Implementor ------- IElectricalEquipment
ConcreteImplementorA andConcreteImplementorB -------- Fan and Light 类
如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。
相关文章推荐
- Design Pattern Bridge 桥设计模式
- design pattern notes [1] - Bridge and composite
- Design Pattern Bridge 桥设计模式
- Bridge Design Pattern (桥模式)
- design pattern notes [1] - Bridge and composite
- Design Pattern Explained 读书笔记五——Bridge
- design_pattern_bridge
- Bridge Design Pattern
- pimpl idiom vs. bridge design pattern
- design_pattern_bridge
- Design Pattern Framework 4.0 C# 之三 Bridge
- Design pattern learning III: Bridge pattern
- C#设计模式(8)——桥接模式(Bridge Pattern)
- Design Pattern Singleton 单一模式
- java设计模式——桥接模式(Bridge Pattern)
- 设计模式-----桥接模式(Bridge Pattern)
- 读书笔记 Head First Design Pattern 第4章
- 第 11 章 桥梁模式【Bridge Pattern】
- 1.接口与工厂 Interface and Factory of Design Pattern
- Head First Design Patterns 阅读笔记之八: the Template Method Pattern