策略模式就类似于c++中的多态,同一行为有不同的实现。

在业务上会有这个场景,比如获取列表,不同的数据源获取不同的列表。那么可能会有这个实现

$upstreamType = $params['upstream_type'];
    $list = [];
    switch ($upstreamType) {
        case 1:
            $list = $this->list1**(**);
            break;
        case 4:
            $list = $this->list4**(**);
            break;
        default:
    }

具体的实现都在switch里或者if里面,如果后续再新增其他类型就要继续在switch里加方法。这其实就违背了开闭原则。所以,怎么才能就算新增类型也不用修改原有代码?策略模式就上场了。

首先不同的类型都有同一个行为,就是获取列表。不同类型有自己的规则,至于它怎么实现不用关心。所以可以通过一个接口类来封装相应的行为,通过继承接口类来具体的实现。这样行为的具体实现都在不同的类里,降低了耦合。

可以和工厂模式结合使用,由工厂来决定具体使用哪个类,只需要传类型即可。

标签: none

添加新评论