Proxy(代理模式)和Facade(外观)设计模式
它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同

Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查
魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息
还可以利用Proxy的类确定代码的范围或调试程序中存在的问题

  1. <?php
  2. class LoggingProxy{
  3. private $target;
  4. //传递进去一个对象
  5. public function __construct($target){
  6. $this->target=$target;
  7. }
  8. protected function log($line){
  9. echo "[".$line."]\r\n";
  10. }
  11. public function __set($name,$value){
  12. $this->target->$name=$value;
  13. $this->log("setting value for $name:$value ");
  14. }
  15. public function __get($name){
  16. $value=$this->target->$name;
  17. $this->log("Getting value for $name:$value");
  18. return $value;
  19. }
  20. public function __isset($name){
  21. $value=isset($this->target->$name);
  22. $this->log("checking isset for $name".($value?"true":"false"));
  23. return $value;
  24. }
  25. public function __call($name,$arguments){
  26. $this->log("calling method $name width:".implode(",", $arguments));
  27. return call_user_func_array(array($this->target,$name), $arguments);
  28.  
  29. }
  30. }
  31. class People{
  32. public $name='hk';
  33. public $age;
  34. public function sayname(){
  35. return $this->name;
  36. }
  37. public function plus($a,$b){
  38. return $a+$b;
  39. }
  40. }
  41. $p=new People();
  42. $proxy=new LoggingProxy($p);
  43. echo $proxy->name;//hk
  44. echo "<br>";
  45. $proxy->age=10;
  46. echo $p->age;//
  47. echo "<br>";
  48. echo $proxy->sayname();
  49. echo "<br>";
  50. 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方法粗略实现如下

  1. <?php
  2. class Facade{
  3. public function apiRequestJson($method,$parameters){
  4. $user=User::getAuthenticatedUser();
  5. if($user->hasPermission($method)){
  6. $result=$this->api->$method($parameters);
  7. return json_encode($result);
  8. }
  9. }
  10. }

Facade并不为子系统添加任何新的功能,而是为子系统委托合适的责任。
子系统无需知道Facade的存在,而应用程序也无需知道子系统的存在。

下面代码,没使用外观模式前

  1. <?php
  2. function getProductFileLines($file){
  3. return file($file);
  4. }
  5. function getProductObjectFromId($id,$productname){
  6. return new Product($id,$productname);
  7. }
  8.  
  9. function getNameFromLine($line){
  10. if(preg_match('#.*-(.*)\s\d+#', $line,$array)){
  11. return str_replace('_', ' ', $array[1]);
  12. }
  13. return '';
  14. }
  15. function getIdFromLine($line){
  16. if(preg_match('#^(\d{1,3})-#', $line,$arr)){
  17. return $arr[1];
  18. }
  19. return -1;
  20. }
  21. class Product{
  22. public $id;
  23. public $name;
  24. public function __construct($id,$name){
  25. $this->id=$id;
  26. $this->name=$name;
  27. }
  28. }
  29.  
  30. $lines=getProductFileLines('t.txt');
  31. $objects=array();
  32. foreach ($lines as $line){
  33. $id=getIdFromLine($line);
  34. $name=getNameFromLine($line);
  35. $objects[$id]=getProductObjectFromId($id, $name);
  36. }

t.txt内容

  1. -ladies_jumper
  2. -gents_hat

如果像以上代码调用子系统,我们的代码和子系统紧紧耦合在一起,当子系统变化时,或者我们决定将其与子系统完全断开时,代码就会出问题,所以我们需要在

这些子系统和代码中引入一个入口。

  1. class ProductFacade{
  2. private $products=array();
  3. public function __construct($file){
  4. $this->file=$file;
  5. $this->compile();
  6. }
  7. private function compile(){
  8. $lines=getProductFileLines($this->file);
  9. foreach ($lines as $line){
  10. $id=getIdFromLine($line);
  11. $name=getNameFromLine($line);
  12. $this->products[$id]=getProductObjectFromId($id, $name);
  13. }
  14. }
  15. public function getProducts(){
  16. return $this->products;
  17. }
  18. public function getProduct($id){
  19. return $this->products[$id];
  20. }
  21. }
  22.  
  23. $facade=new ProductFacade('t.txt');
  24. echo $facade->getProduct(234)->name;

php设计模式之Proxy(代理模式)和Facade(外观)设计模式的更多相关文章

  1. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  2. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  3. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

  4. 设计模式12: Proxy 代理模式(结构型模式)

    Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...

  5. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. C++设计模式-Proxy代理模式

    Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...

  7. Java设计模式(八)Proxy代理模式

    一.场景描述 代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东.法律程序与我们打交道. 当然,设计模式中的代理与广义的代 ...

  8. Proxy 代理模式

    简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...

  9. Proxy 代理模式 动态代理 cglib MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. Delphi 线程的处理

    http://www.cnblogs.com/doit8791/archive/2012/05/16/2502671.html

  2. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  3. BPMN

    1.私有业务流程: 特定行业规则制度比如惠普生产线流程-针对业务人员 2.公有业务流程: 技术实现-针对流程开发人员 http://www.blogjava.net/RongHao/archive/2 ...

  4. 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息

    首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...

  5. UITableViewCell之微博篇

    微博篇 本应用所涉及的知识点: 1.UITableView 中的cell 2.模型的创建 3.MJExtension第三方框架的使用 需求分析 1.界面分析 微博界面 界面控件分析: 整个页面 1.不 ...

  6. (转)直接拿来用!最火的iOS开源项目(一)

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

  7. (转)Struts2返回JSON对象的方法总结

    转自:http://kingxss.iteye.com/blog/1622455 如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选 ...

  8. Android Activity 详述

    activity类处于android.app包中,继承关系: extends ContextThemeWrapper implements LayoutInflater.Factory2 Window ...

  9. C/C++程序员面试易错题

    c部分::::::::::::::::::::::::::::::::::: . 关键字volatile有什么含意? 并给出三个不同的例 子. [参考答案]一个定义为volatile的变量是说这变量可 ...

  10. button的type属性

    今天为看懂一段js代码纠结了很久,搞不明白数据是如何实现post,因为button没有规定属性,其次对submit事件没太搞明白.忽然想起默认属性这个概念,豁然开朗,啊~ 1.请始终为按钮规定 typ ...