zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    <?php
    interface IStrategy
    {
        function filter( $record );
    }//定义一个接口
    
    class FindNameWithA implements IStrategy//实现接口
    {
        public function filter($record) 
        {
            $record = strtolower($record);//变换成小写
            if (strpos($record, 'a')!==false) {//返回record中a出现在第几个,这里是看是否有a这个字母
                return true;
            }
            return false;
        }
    }
    class FindAfterStrategy implements IStrategy
    {
        private $_name;
    
        public function __construct( $name )
        {
            $this->_name = $name;
        }
    
        public function filter( $record )
        {
            return strcmp( $this->_name, $record ) <= 0;//比较两个字符串
        }
    }
    
    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);
    
    $f3 = $ul->find(new FindNameWithA());
    print_r($f3);
    

      先对上述例子进行分析,先设置几种策略,这几种策略是对字符串进行操作的几种方式。分别有找出含有a的,找出含有?的,?作为参数传入,还有随即找出一个。

    这几个策略都写成类。主类写成一个含有添加字符串功能的类,还有一个是对字符串的操作方法,在这个操作方法中传入一个策略的对象作为参数。在方法里面调用这个参数对象内的字符串处理方法(除此还有一个构造方法),然后输出结果。

    大体思路。1.写几个策略

         2.在主类的字符串处理函数中加入策略对象作为参数。

           3.所有策略都有一个同名的方法(实现一个接口),在主类中需要处理字符串的位置用  处理函数的参数(策略对象)->策略中公共的处理字符串的函数的名字   的方式来调用

         4.这个时候只需要实例化一个主类(同时已经包含一个数组),用对象->方法的方式来调用主类中的字符串处理函数,传入需要的策略的对象,这时会自动调用这个策略对象的字符串处理函数。

         

  • 相关阅读:
    Arpa's weak amphitheater and Mehrdad's valuable Hoses
    Arpa's loud Owf and Mehrdad's evil plan
    穷游中国在统题
    2016 ACM Amman Collegiate Programming Contest D Rectangles
    区间求和
    Redis 连接池的问题
    eBay 使用ReviseInventoryStatusCall调整库存和价格
    eBay Notification介绍
    Quartz.Net 配置模板范例
    Quartz.net misfire实践
  • 原文地址:https://www.cnblogs.com/tobemaster/p/5767107.html
Copyright © 2011-2022 走看看