巅云智能建站平台搭建版(创业门户版)火爆上线,终身授权!新增:文章智能采集+全站真静态打包+城市分站+智能小程序+非法词过滤+H5自适应+智能链词等功能功能详情
建站资讯News

php设计模式之委托模式

0
一佰互联网站建设(www.yinxi.net) 发布时间:2019-04-27 10:44:32 浏览数: 103

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。下面是PHP 反射机制实现动态代理的代码:

<?phpclass Fruit{  function callFruit()  {    print "Generate an Apple";  }}class FruitDelegator{ private $targets;  function __construct()  {    $this->target[] = new Fruit();  }    function __call($name, $args)  {    foreach ($this->target as $obj)    {      $r = new ReflectionClass($obj);      if ($method = $r->getMethod($name))      {        if ($method->isPublic() && !$method->isAbstract())        {          return $method->invoke($obj, $args);        }      }    }  }}$obj = new FruitDelegator();$obj->callFruit();// 运行结果// Generate an Apple?>

可见,通过代理类FruitDelegator来代替Fruit类来实现他的方法。同样的,如下的代码也是能够运行的:

<?phpclass Color{  function callColor()  {    print "Generate Red";  }} class ColorDelegator{  private $targets;     function addObject($obj)  {    $this->target[] = $obj;  }     function __call($name, $args)  {    foreach ($this->target as $obj)    {      $r = new ReflectionClass($obj);      if ($method = $r->getMethod($name))      {        if ($method->isPublic() && !$method->isAbstract())        {          return $method->invoke($obj, $args);        }      }    }  }}$obj = new ColorDelegator();$obj->addObject(new Color());$obj->callColor();?>

设计了一个cd类,类中有mp3播放模式,和mp4播放模式改进前,使用cd类的播放模式,需要在实例化的类中去判断选择什么方式的播放模式 改进后,播放模式当做一个参数传入playList函数中,就自动能找到对应需要播放的方法。

一、未改进前

<?php //使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程 class cd {  protected $cdInfo = array();    public function addSong($song) {   $this->cdInfo[$song] = $song;  }    public function playMp3($song) {   return $this->cdInfo[$song] . ".mp3";  }    public function playMp4($song) {   return $this->cdInfo[$song] . ".mp4";  } } $oldCd = new cd; $oldCd->addSong("1"); $oldCd->addSong("2"); $oldCd->addSong("3"); $type = "mp3"; if ($type == "mp3") {  $oldCd->playMp3(); } else {  $oldCd->playMp4(); }

二、通过委托模式,改进后的cd类

<?php namespace Tools; /*委托模式去除核心对象中的判决和复杂功能性*/ //委托接口interface Delegate{ public function playList($list,$song);} //mp3处理类class mp3 implements Delegate{ public function playList($list,$song){  return $list[$song].".mp3"; }} //mp4处理类class mp4 implements Delegate{ public function playList($list, $song) {  return $list[$song].".mp4"; }} class cdDelegate{ protected $cdInfo = array();  public function addSong($song){  $this->cdInfo[$song] = $song; }  public function play($type,$song){  $name = "Tools\".$type;  $obj = new $name;  return $obj->playList($this->cdInfo,$song); }} $newCd = new cdDelegate();$newCd->addSong("1");$newCd->addSong("2");$newCd->addSong("3");echo $newCd->play("mp3","1");//只要传递参数就能知道需要选择何种播放模式

再为大家分享一个实例:

<?php/** * 委托模式 示例 * * @create_date: 2010-01-04 */class PlayList{ var $_songs = array(); var $_object = null;  function PlayList($type) {  $object = $type."PlayListDelegation";  $this->_object = new $object(); }  function addSong($location,$title) {  $this->_songs[] = array("location"=>$location,"title"=>$title); }  function getPlayList() {  return $this->_object->getPlayList($this->_songs); }} class mp3PlayListDelegation{ function getPlayList($songs) {  $aResult = array();  foreach($songs as $key=>$item)  {   $path = pathinfo($item["location"]);   if(strtolower($item["extension"]) == "mp3")   {    $aResult[] = $item;   }  }  return $aResult; }} class rmvbPlayListDelegation{ function getPlayList($songs) {  $aResult = array();  foreach($songs as $key=>$item)  {   $path = pathinfo($item["location"]);   if(strtolower($item["extension"]) == "rmvb")   {    $aResult[] = $item;   }  }  return $aResult; }} $oMP3PlayList = new PlayList("mp3");$oMP3PlayList->getPlayList();$oRMVBPlayList = new PlayList("rmvb");$oRMVBPlayList->getPlayList();?>

以上就是本文的全部内容,希望对大家的学习有所帮助。

一佰互联是全国知名建站品牌服务商,我们有九年网站建设、网站制作、网页设计、php开发和域名注册及虚拟主机服务经验,提供的自助建站服务更是全国有名。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版,拖拽排版网站制作设计,轻松实现pc站、手机微网站、小程序、APP一体化全网营销网站建设 ,已成功的为全国上百家网络公司提供自助建站平台搭建服务。

上一篇:PHP闭包函数详解
下一篇: PHP常用设计模式之委托设计模式
[返回新闻列表]

相关新闻more

29
04月
PHP代码优化的53个细节

用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是... >>详情

29
04月
php更新修改excel中的内容实例代码

复制代码 代码如下://模板存放目录$dir = $DOCUMENT_ROOT."/backoffice/admin/oemcheck/";... >>详情

02
12月
设计优化两者相者是分不开的

做过排名的朋友几乎都会知道想要得到好的优化效果,与一个到好的网站设计是分不开的,两者相辅相成相成,那么需要怎么设计才能够做到有助于搜索引擎的... >>详情

05
04月
微分销要怎么推广

简介:已经在呈下滑的趋势,很多传统企业转型已经不会选择淘宝和天猫了。但是传统企业转型又是迫在眉睫。在这个时候,微信分销的出现打破了这个尴尬的... >>详情

高端网站建设

美工兼顾SEO,为企业电子商务营销助力!

电话:

023-85725751
建站

产品

域名注册 虚拟主机 云服务器 企业邮局
智能建站 APP打包 微站/小程序 创业平台
网站推广 媒体营销 智能采集 AI机器人
400电话 短信营销 店销机器人
私人定制 门户网站