定义:
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
其实策略模式是一个非常重要的模式,它把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在定义一个上下文类中包含实现这个接口的类对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有策略来实现应用程序的功能,策略的实现都基于统一的接口,便于以后切换算法或增加算法而不更改现有的架构。
举个很常用的例子,我们在开发应用的过程中,常常面临着切换数据库的问题,在开发的时候,我们可能仅仅关注于某一数据库。那么在将来的运行过程中,需要却换到其他的数据库,那么应该怎么办呢,使用策略模式则很好的解决了这个问题。
下面我们来一起看看策略模式的UML类图:
首先我们定义了一个IDataBase的接口,用于约定算法需要实现哪些方法。然后我们写了两个策略具体的实现类,一个Mysql,另外一个Salserver。另外我们还需要一个Context上下文类来获得我们具体使用的那一个数据库。相关代码如下:
//公共接口
<?php
Interface IDataBase{
//连接数据库
public function connect();
//关闭数据
public function close();
//持久化数据
public function persist();
}
<?php
class Mysql extends IDataBase{
public function connect(){
//这里是具体的链接数据库的操作, 为了简单我省去了参数列表
}
public function close(){
//关闭数据库链接的代码
}
public function persist(){
//持久化数据库的代码
}
}
<?php
class Sqlserver extends IDataBase{
public function connect(){
//这里是具体的链接数据库的操作, 为了简单我省去了参数列表
}
public function close(){
//关闭数据库链接的代码
}
public function persist(){
//持久化数据库的代码
}
}
<?php
class Context{
private static $db = null;
private function __construct(){
//这里可以通过配置文件得到使用什么样的数据库和数据库链接参数
}
public static function getInstanse(){
if($db === null){
return new Context();
}
return self::$db;
}
}
以上代码就是策略模式的具体实现了,我们可以看到,系统在后期如果需要添加新的数据库支持,只需要新建一个策略类实现IDataBase接口,然后更改配置项就可以轻松的进行数据库切换了。