设为首页 收藏本站
查看: 1365|回复: 0

[经验分享] PHP设计模式之适配器模式,建造者模式,数据访问对象模式

[复制链接]

尚未签到

发表于 2017-4-14 10:28:45 | 显示全部楼层 |阅读模式
设计模式的目的是帮助我们以便于重用的方式来设计解决方案。
1.适配器模式Adapter
  class errorObject //这个类用来存储错误信息
  {
  private $__error;
  

  public function __construct($error)
  {
  $this->__error=$error;
  }
  

  public function getError()
  {
  return $this->__error;
  }
  }
  

  class logToConsole
  {
  private $__errorObject;
  

  public function __construct($errorObject)
  {
  $this->__errorObject=$errorObject;
  }
  

  public function write()
  {
  fwrite(STDERR,$this->__error);
  }
  }
  

  

  调用时:
  $error=new errorObject("404:Not Found");
  $log=new logToConsole($error);
  $log->write();
  //将结果输出到控制台
  

  这时需求变更为用不同的方式将显示错误信息在一个CSV文件中,有现成的类如下
  class logToCSV
  {
  const CSV_LOCATION = 'log.csv';
  private $__errorObject;
  

  public function __construct($errorObject)
  {
  $this->__errorObject = $errorObject;
  }
  

  public function write()
  {
  $line=$this->__errorObject->getErrorNumber();
  $line.=',';
  $line=$this->__errorObject->getErrorText();
  $line.="\n";
  file_put_contents(self::CSV_LOCATION,$line,FILE_APPEND);
  }
  }
  

  

2.建造者模式Builder
  class product
{
protected $_type= ' ';
protected $_size= ' ';
protected $_color= ' ';
public function setType($type)
{
$this->_type=$type;
]

public function setSize($size)
{
$this->_size=$size;
]


  public function setColor($color)
{
$this->_color=$color;
}
}
在调用时:
$productConfigs=array('type'=>'shirt','size'=>'XL','color'=>'black');
$product=new product();
$product->setType($productConfigs('type'));
$product->setSize($productConfigs('size'));
$product->setColor($productConfigs('color'));


创建对象时分别调用每个方法并不是最好的做法,我们用一个建造者设计模式来创建产品实例
class productBuilder
{
protected $_product=NULL;
protected $_configs=array();


  public function __construct($configs)
{
$this->_product=new product();
$this->_configs=$configs;
}


  public function build()
{
$this->_product->setType($configs['type']);
$this->_product->setSize($configs['size']);
$this->_product->setColor($configs['color']);
}


  public function getProduct()
{
return $this->_product;
}
}
这样build()方法隐藏了新product对象的代码实际的调用,如果以后product类发生了改变,只需要改变build方法就可以了
$builder = new productBuilder($productConfigs);
$builder = build();
$product=$builder->getProduct();
建造者设计模式的目的是消除其他对象的复杂创建过程,在某个对象的构造和配置方法改变时也可以减少重复代码的更改。


  

3.数据访问对象模式
  数据库访问对象设计模式描述了如何创建提供透明访问任何数据源的对象。
  abstruct class baseDataAccessObject
  {
  private $__connection;
  

  public function __construct()
  {
  $this->__connectToDB(DB_USER,DB_PASS,DB_HOST,DB_DATABASE);
  }
  

  private function __connectToDB($user,$pass,$host,$database)   
  {
  $this->__connection =mysql_connect($host,$user,$pass);     //连接数据库
  mysql_select_db($database,$this->_connection);             //选择数据库
  }
  

  public function fetch($value,$key=NULL)
  {
  if(is_null($key))
  $key =$this->_primaryKey;
  

  $sql="select * from {$this->_tableName} where {$key}='{$value}' ";        //sql查询语句
  $results=mysql_query($sql,$this->__connection);                  //返回结果
  

  $rows=array();
  while($result=mysql_fetch_array($results))       //处理返回结果
  {
  $rows[]=$result;
  }
  return $rows;
  }
  

  public function update($keyedArray)
  {
  $sql="update {$this->_tableName} set ";          //查询语句的一半
  $updates =array();
  foreach($keyedArray as $column=>$value)
  {
  $updates[]="{$column}='{$value}'";
  }
  $sql.=implode(',',$updates);
  $sql.="where {$this->_primaryKey}='{$keyedArray[$this->_primaryKey]}'";
  
  mysql_query($sql,$this->this->connection);
  }
  }
  不过上面的抽象类是不能直接用的,必须继承后实例化才行
  class userDataAccessObject extends baseDataAccessObject
  {
  protected $_tableName='userTable';
  protected $_primaryKey='id';
  

  public function getuserByFirstName($name)
  {
  $result=$this->fetch($name,'firstName');
  return $result;
  }
  }
  

  具体调用的时候:
  define('DB_USER','user');
  define('DB_PASS','pass');
  define('DB_HOST','localhost');
  define('DB_DATABASE','test');
  

  $user=new userDataAccessObject();
  $userDetailsArray =$user->fetch(1);
  //获得id为1的用户信息
  $updates=array('id'=>1,'firstName'=>'zxc');
  $user->update($updates);
  //更新id为1的用户的firstName为zxc
  $userzxc=$user->getUserByFirstName('zxc');
  //通过新定义的方法来从数据库中取到用户信息

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-364822-1-1.html 上篇帖子: PHP设计模式之装饰器模式,委托模式,外观模式 下篇帖子: PHP程序61条面向对象分析设计的经验原则
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表