php核心学习-设计模式的学习-委托模式

来源:互联网 发布:网达软件股票 编辑:程序博客网 时间:2024/06/10 17:32

委托者模式

为其它对象提供一种代理以控制对这个对象的访问

简单的理解如下图所示:
这里写图片描述

下面我们导入一个场景来学习委托者模式:
电商网站上面现在卖有茶轴键盘,电扇网站会员和电扇网站普通会员买的折扣是不一样的,现在我们模拟不同用户购买键盘订单的价格。
首先,创建了以下的目录结构
这里写图片描述
其中user就是我们项目的委托者代理
实体:
keyboard.php

<?phpclass 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.智能化 动态代理是最好的体现,即在运行阶段才指定实际代理对象

原创粉丝点击