PHP设计模式之策略模式

来自:互联网
时间:2020-07-27
阅读:

在开发PHP的项目时我们经常会先考虑我们使用什么设计模式,是程序执行更顺利,接下来免费资源网就为大家介绍一下策略模式原理与实现方法,有需要的小伙伴可以参考一下:

1、定义:

    将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,并让它们可以相互替换,这种模式就是策略模式。

2、应用场景:

(1)、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

(2)、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

(3)、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

(4)、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为的情况。

(5)、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

3、实例:

//定义接口
interface IStrategy {
    function filter($record);
}
//实现接口方式1
class FindAfterStrategy implements IStrategy {
    private $_name;
    public function __construct($name) {
        $this->_name = $name;
    }
    public function filter($record) {
        return strcmp ( $this->_name, $record ) <= 0;
    }
}
//实现接口方式1
class RandomStrategy implements IStrategy {
    public function filter($record) {
        return rand ( 0, 1 ) >= 0.5;
    }
}
//主类
class UserList {
    private $_list = array ();
    public function __construct($names) {
        if ($names != null) {
            foreach ( $names as $name ) {
                $this->_list [] = $name;
            }
        }
    }

    public function add($name) {
        $this->_list [] = $name;
    }

    public function find($filter) {
        $recs = array ();
        foreach ( $this->_list as $user ) {
            if ($filter->filter ( $user ))
                $recs [] = $user;
        }
        return $recs;
    }
}

$ul = new UserList ( array (
    "Andy",
    "Jack",
    "Lori",
    "Megan"
) );
$f1 = $ul->find ( new FindAfterStrategy ( "J" ) );
print_r ( $f1 );

$f2 = $ul->find ( new RandomStrategy () );

print_r ( $f2 );

4、小结:

    (1)、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;

    (2)、针对接口编程,不针对实现编程;

    (3)、多用组合,少用继承。

返回顶部
顶部