计划了好久,今天终于可以静下心来敲打着键盘,记下自己喜欢的符号。
当大家都在讨论着设计模式的利与弊的时候,我曾经犹豫了好久,到底有没有必要去针对性的学习设计模式,特别是PHP的设计模式。
后来慢慢的接触,慢慢的不停地钻研,慢慢的发现,学习设计模式,还有另外的收获。也许工作中我们没有去用到,也许我们可以完全有意识的避开设计模式,也可以写出优雅的代码。可是,在学习设计模式的过程中我学会了怎么样去思考问题,怎么样去把OO思想理解的更透彻。
所以我下定决心去学习设计模式,去和喜欢思考的人分享自己的所学。我是一个菜鸟,我的英语水平更差,不过我会竭尽所能去翻译好我自己遇到的好的文章。还要去写下属于自己的东西。
网络上太多设计模式是用JAVA实现的,我也非常喜欢JAVA语言,但是我现在从事的工作是PHP,也想去和喜欢PHP的朋友一起去了解更深的知识。
在这个系列中我引用的是一个国外网站的原创。我并不是逐句的翻译,而是在自己理解的基础上,用自己的语言,更符合中国人的语言去解释。所有的代码我也会经过反复的测试,去更好的诠释他们提供的代码。
第一篇是策略模式(strategy).
策略模式定义了一个代表解决特殊任务算法的对象。
Introduction(介绍)
在面向对象的应用程序里,很多时候当一个新的任务被确定,程序员的第一反应通常是去创造一个新的类去展示它。然而,不久以后,新的类会演变为包含很多子功能(类),而每一个子功能(类)又进一步增加了原来类的复杂性。在某些情况下,这些子功能(类)也许很多都是可以切换的。举一个Logger类的例子:本来Logger类是用来向一个文件夹里写日志信息的。后来可能会去扩展它的功能,让它可以去记录到许多别的东地方例如:File和Datebase.一个额外的需求可能还要允许写入的信息用不同的方式进行格式化例如:a simple String,XML,serialised data, 或者是 HTML.
我们的类现在有一个主要的任务--记录日志,和两个独特的子功能--格式化记录的内容和记录到指定的地方。每一个子功能有许多不同的实现。策略模式建议采用一种实现类结构的手段,这种手段能避免程序员在实现灵活的结构拓展中遇到一些普遍的缺陷,于此同时还帮助程序员能够驾驭这种灵活性,并且易于将来对结构的扩展 .此外,策略模式展示了如何构建比简单子类更强大的类。
最核心的,也非常的简单是我们的Logger类。不论怎么样我们重构和扩展Logger类,我们应该针对维护一个简单的接口。PHP5提供了一种强制执行一个接口的能力。它可以简单到只创建一个接口去使所有可能是的具体实现Logger类必要遵循。
- interface iWriter {
- public function write();
- }
没有必要去花费太多的时间讲解接口。所有实现接口的类必须要实现接口中所有定义的方法。如果没有的话将会有一个致命的错误。我们定义了一个iWriter接口而不是iLogger,稍后会有一个更一般的描述和也许可能反复的用于其它的类。
定义完一个接口之后,让我们来再次访问Logger类。我们的最原始的Logger类也许看起来是这样:
- class Logger {
- private $file = null;
- public function __construct($file) {
- $this->file = $file;
- }
- public function write($message) {
- file_put_contents($this->file, array(PHP_EOL, $message), FILE_APPEND);
- }
- }
这个类非常的简单。它实例化一个本地的文件去存储log信息。当Logger::write()被调用,它会打开你所设定的文件并且会把你的$message参数值加在该文件的最后。
它的使用非常的简单:
- $logger = new Logger('./tmp/mylog.txt');
- $logger->write('This is a log message!');
需要在当前文件下建立tmp文件,在tmp文件下建立mylog.txt
以上为记录日记的方法,接着我们来扩展它。来真正是使用策略模式实现简单的扩展,而不用影响其他的实现类。