这篇博文是阅读老外写的博文后,自己参照了他的思想实现的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 类
如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。