委托者模式
为其它对象提供一种代理以控制对这个对象的访问
简单的理解如下图所示:
下面我们导入一个场景来学习委托者模式:
电商网站上面现在卖有茶轴键盘,电扇网站会员和电扇网站普通会员买的折扣是不一样的,现在我们模拟不同用户购买键盘订单的价格。
首先,创建了以下的目录结构
其中user就是我们项目的委托者代理
实体:
keyboard.php
<?php
class keyboard
{
//键盘价格
public function getPrice() {
return 1500;
}
}
用户等级
普通用户noruser.php
<?php
/**
* Class noruser
* 普通用户类
*/
class noruser
{
//普通会员折扣
public function getDisCount() {
return 0.95;
}
}
网站会员用户vipuser.php
<?php
/**
* 网站会员
*/
class vipuser
{
//电商网站会员折扣
public function getVipDisCount() {
return 0.5;
}
}
委托者代理
user.php
<?php
//用户代理类
class user
{
public $delegator=null;//委托者对象
function __call($name, $arguments)
{
// TODO: Implement __call() method.
if ($this->delegator!=null) {
return call_user_func_array([$this->delegator,$name],$arguments);
}
return false;
}
}
模拟返回商品价格
order.php
<?php
/**
* 模拟演示使用委托这模式返回商品价格
*/
require ("keyboard.php");
require ('user.php');
require ('noruser.php');
require ("vipuser.php");
$user=new user();
$keyboard=new keyboard();
$user->delegator=new vipuser();
$user->getVipDisCount();
echo "会员购买茶轴键盘的价格是:".$keyboard->getPrice()*$user->getVipDisCount();
echo "<br/>";
$user->delegator=new noruser();
echo "会员购买茶轴键盘的价格是:".$keyboard->getPrice()*$user->getDisCount();
效果如下:
优点:
1.职责清晰 真实的角色就是实现的业务逻辑,不用关心其他非本指责的事务
2.高扩展性 具体主题角色不能怎么变化,只要它实现了接口,代理类完全可以在不做任何修改的情况下使用
3.智能化 动态代理是最好的体现,即在运行阶段才指定实际代理对象