实例和使用示例:
```
 * class ModelProxy_UserBaseInfo extends PhalApi_ModelProxy {
 *
 *      protected function doGetData($query) {
 *      	$model = new Model_User();
 *      
 *      	return $model->getByUserId($query->id);
 *      }
 *     
 *      protected function getKey($query) {
 *      	return 'userbaseinfo_' . $query->id;
 *      }
 *     
 *      protected function getExpire($query) {
 *      	return 600;
 *      }
 * }
 * 
 * //最终的调用
 * $query = new PhalApi_ModelQuery();
 * $query->id = $userId;
 * $modelProxy = new ModelProxy_UserBaseInfo();
 * $rs = $modelProxy->getData($query);
```
 *
 * @package     PhalApi\Model
 * @license     http://www.phalapi.net/license GPL 协议
 * @link        http://www.phalapi.net/
 * @author      dogstar  2015-02-22
 */
abstract class PhalApi_ModelProxy {
	
	protected $cache;
	/**
	 * 为代理指定委托的缓存组件,默认情况下使用DI()->cache
	 */
	public function __construct(PhalApi_Cache $cache = NULL) {
		$this->cache = $cache !== NULL ? $cache : DI()->cache;
		//退而求其次
		if ($this->cache === NULL) {
			$this->cache = new PhalApi_Cache_None();
		}
	}
	/**
	 * 获取源数据 - 模板方法
	 *
	 * @param PhalApi_ModelQuery $query 查询对象
	 * @return mixed 返回源数据,但在失败的情况下别返回NULL,否则依然会穿透到此
	 */
	public function getData(PhalApi_ModelQuery $query = NULL) {
		$rs = NULL;
		if ($query === NULL) {
			$query = new PhalApi_ModelQuery();
		}
		if ($query->readCache) {
			$rs = $this->cache->get($this->getkey($query));
			if ($rs !== NULL) {
				return $rs;
			}
		}
		// 这里,将获取耗性能的数据
		$rs = $this->doGetData($query);
		if ($query->writeCache) {
			$this->cache->set($this->getKey($query), $rs, $this->getExpire($query));
		}
		return $rs;
	}
	
	/**
	 * 获取源数据 - 具体实现
	 */
	abstract protected function doGetData($query);
	/**
	 * 返回唯一缓存key,这里将$query传入,以便同类数据根据不同的值生成不同的key
	 */
	abstract protected function getKey($query);
	/**
	 * 返回缓存有效时间,单位为:秒
	 */
	abstract protected function getExpire($query);
}