每日一记之策略模式

定义:

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

其实策略模式是一个非常重要的模式,它把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在定义一个上下文类中包含实现这个接口的类对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有策略来实现应用程序的功能,策略的实现都基于统一的接口,便于以后切换算法或增加算法而不更改现有的架构。

举个很常用的例子,我们在开发应用的过程中,常常面临着切换数据库的问题,在开发的时候,我们可能仅仅关注于某一数据库。那么在将来的运行过程中,需要却换到其他的数据库,那么应该怎么办呢,使用策略模式则很好的解决了这个问题。

下面我们来一起看看策略模式的UML类图:



首先我们定义了一个IDataBase的接口,用于约定算法需要实现哪些方法。然后我们写了两个策略具体的实现类,一个Mysql,另外一个Salserver。另外我们还需要一个Context上下文类来获得我们具体使用的那一个数据库。相关代码如下:


//公共接口

<?php
Interface IDataBase{
    
    //连接数据库
    public function connect();

    //关闭数据
    public function close();
    
    //持久化数据
    public function persist();
}


//Mysql实现方式
<?php

class Mysql extends IDataBase{
    public function connect(){
        //这里是具体的链接数据库的操作, 为了简单我省去了参数列表
    }
    
    public function close(){
        //关闭数据库链接的代码
    }
    
    public function persist(){
        //持久化数据库的代码
    }
}


//sqlserver实现方式
<?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接口,然后更改配置项就可以轻松的进行数据库切换了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值