php设计模式之策略模式


 在此模式中,算法是从复杂类提取的,因而可以方便地替换。 例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个 类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。


 作为一个较简单的示例,下面 显示了一个用户列表类,它提供了一个根据一组即插即用的策略查找一组用户的方法


    //定义接口  
    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 );    
    策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方式方面需要较高的灵活性  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值