php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式
它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同
Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查
魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息
还可以利用Proxy的类确定代码的范围或调试程序中存在的问题
<?php
class LoggingProxy{
private $target;
//传递进去一个对象
public function __construct($target){
$this->target=$target;
}
protected function log($line){
echo "[".$line."]\r\n";
}
public function __set($name,$value){
$this->target->$name=$value;
$this->log("setting value for $name:$value ");
}
public function __get($name){
$value=$this->target->$name;
$this->log("Getting value for $name:$value");
return $value;
}
public function __isset($name){
$value=isset($this->target->$name);
$this->log("checking isset for $name".($value?"true":"false"));
return $value;
}
public function __call($name,$arguments){
$this->log("calling method $name width:".implode(",", $arguments));
return call_user_func_array(array($this->target,$name), $arguments); }
}
class People{
public $name='hk';
public $age;
public function sayname(){
return $this->name;
}
public function plus($a,$b){
return $a+$b;
}
}
$p=new People();
$proxy=new LoggingProxy($p);
echo $proxy->name;//hk
echo "<br>";
$proxy->age=10;
echo $p->age;//
echo "<br>";
echo $proxy->sayname();
echo "<br>";
echo $proxy->plus(2,3);
结果
[Getting value for name:hk] hk
[setting value for age:10 ] 10
[calling method sayname width:] hk
[calling method plus width:2,3] 5
多数情况下Proxy不应该改变它所代理的类的行为
Proxy与它所代理的在类型上不完全一致,这也是其一个缺点。
因而若需要进行类型提示或代码检查以确保对象是某一特定类型,这种情况下就不能使用代理模式
Facade(外观)模式提供了不同的功能,用来抽象化复杂功能,以使应用程序无需了解子系统处理
各请求的细节,就能完成整个处理过程
例如:处理典型api请求时,用户需要通过子系统进行认证,认证通过后,请求通过api子系统传递给远程服务器
处理,最后通过其它api的函数对相应解码
Facade方法粗略实现如下
<?php
class Facade{
public function apiRequestJson($method,$parameters){
$user=User::getAuthenticatedUser();
if($user->hasPermission($method)){
$result=$this->api->$method($parameters);
return json_encode($result);
}
}
}
Facade并不为子系统添加任何新的功能,而是为子系统委托合适的责任。
子系统无需知道Facade的存在,而应用程序也无需知道子系统的存在。
下面代码,没使用外观模式前
<?php
function getProductFileLines($file){
return file($file);
}
function getProductObjectFromId($id,$productname){
return new Product($id,$productname);
} function getNameFromLine($line){
if(preg_match('#.*-(.*)\s\d+#', $line,$array)){
return str_replace('_', ' ', $array[1]);
}
return '';
}
function getIdFromLine($line){
if(preg_match('#^(\d{1,3})-#', $line,$arr)){
return $arr[1];
}
return -1;
}
class Product{
public $id;
public $name;
public function __construct($id,$name){
$this->id=$id;
$this->name=$name;
}
} $lines=getProductFileLines('t.txt');
$objects=array();
foreach ($lines as $line){
$id=getIdFromLine($line);
$name=getNameFromLine($line);
$objects[$id]=getProductObjectFromId($id, $name);
}
t.txt内容
-ladies_jumper
-gents_hat
如果像以上代码调用子系统,我们的代码和子系统紧紧耦合在一起,当子系统变化时,或者我们决定将其与子系统完全断开时,代码就会出问题,所以我们需要在
这些子系统和代码中引入一个入口。
class ProductFacade{
private $products=array();
public function __construct($file){
$this->file=$file;
$this->compile();
}
private function compile(){
$lines=getProductFileLines($this->file);
foreach ($lines as $line){
$id=getIdFromLine($line);
$name=getNameFromLine($line);
$this->products[$id]=getProductObjectFromId($id, $name);
}
}
public function getProducts(){
return $this->products;
}
public function getProduct($id){
return $this->products[$id];
}
} $facade=new ProductFacade('t.txt');
echo $facade->getProduct(234)->name;
php设计模式之Proxy(代理模式)和Facade(外观)设计模式的更多相关文章
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- 设计模式(12)--Proxy(代理模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...
- 设计模式12: Proxy 代理模式(结构型模式)
Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- C++设计模式-Proxy代理模式
Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...
- Java设计模式(八)Proxy代理模式
一.场景描述 代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东.法律程序与我们打交道. 当然,设计模式中的代理与广义的代 ...
- Proxy 代理模式
简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...
- Proxy 代理模式 动态代理 cglib MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 查看django里所有的url
>>> from django.core.urlresolvers import get_resolver >>> get_resolver(None).rever ...
- nyoj 92 图像有用区域
点击打开链接 图像有用区域 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 "ACKing"同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取 ...
- Wireshark "The NPF driver isn’t running…"
(1)如果你使用的是Linux.Ubuntu系统,请用 >$ su Administrator命令切换到拥有最高权限的帐号,然后再输入命令:“net start npf”(如果不行自己查找类似命 ...
- (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功夫不负有心 ...
- Java8新特性【转】
地址:http://ifeve.com/java-8-features-tutorial/ 1.简介 毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Ja ...
- JavaScript对象的创建之工厂方法
通过工厂的方式来创建Person对象,在createPerson中创建一个对象,然后为这个对象设置相应的属性和方法,之后返回这个对象. function createPerson(name, age) ...
- MFC学习 多线程
#include <Windows.h> #include <process.h> #include <stdio.h> HANDLE hMutex; //互斥对象 ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
- Laxcus大数据管理系统2.0(2)- 第一章 基础概述 1.1 基于现状的一些思考
第一章 基础概述 1.1 基于现状的一些思考 在过去十几年里,随着互联网产业的普及和高速发展,各种格式的互联网数据也呈现爆炸性增长之势.与此同时,在数据应用的另一个重要领域:商业和科学计算,在各种新兴 ...
- 全局变量 urllib模块 json模块
1.vars() 查看一个.py文件中的全局变量 print(vars()) #重点 __name__': '__main__ '__file__': 'C:/Users/lenovo/Pychar ...