首页 > 开发 > PHP > 正文

PHP设计模式之适配器模式定义与用法详解

2024-05-04 22:43:40
字体:
来源:转载
供稿:网友

本文实例讲述了PHP设计模式之适配器模式定义与用法。分享给大家供大家参考,具体如下:

适配器很容易理解, 大多数人家庭都有手机转接器, 用来为移动电话充电,这就是一种适配器. 如果只有USB接头, 就无法将移动电话插到标准插座上. 实际上, 必须使用一个适配器, 一端接USB插头, 一端接插座. 当然, 你可以拿出电气工具,改装USB连接头, 或者重新安装插座, 不过这样会带来很多额外的工作, 而且可能会把连接头或插座弄坏. 所以, 最可取的方法就是找一个适配器. 软件开发也是如此.

类适配器模式(使用继承)

类适配器模式很简单, 不过与对象适配器模式相比, 类适配器模式的灵活性弱些, 类适配器简单的原因在于 , 适配器(Adapter)会从被适配者(Adaptee)继承功能, 所以适配模式中需要编写的代码比较少.

由于类适配器模式包含双重继承, 但是PHP并不支持双重继承, 不过幸运的是,PHP可以用接口来模拟双重继承, 下面是一个正确的结构, 不仅继承了一个类, 同时还继承了一个接口

class ChildClass extends ParentClass implements ISomeAdapter{}

实现类适配器模式时, 参与者必须包括一个PHP接口

下面以一个货币兑换为例来演示:

假设有一个企业网站在同时销售软件服务和软件产品, 目前, 所有交易都在美国进行, 所以完全可以用美元来完成所有计算.现在开发人员希望能有一个转换器能处理美元和欧元的兑换, 而不改变原来按美元交易额的类.通过增加一个适配器, 现在程序即可以用美元计算也可以用欧元计算.

DollarCalc.php

<?phpclass DollarCalc{ private $dollar; private $product; private $service; public $rate = 1; public function requestCalc($productNow, $serviceNow) {  $this->product = $productNow;  $this->service = $serviceNow;  $this->dollar = $this->product + $this->service;  return $this->requestTotal(); } public function requestTotal() {  $this->dollar *= $this->rate;  return $this->dollar; }}

查看这个类,可以看到其中有一个属性$rate,requestTotal()方法使用$rate计算一次交易的金额.在这个版本中, 这个值设置为1,实际上总金额无需再乖以兑换率, 不过如果要为客户提供折扣或者要增加额外服务或产品的附加费, $rate变量会很方便. 这个类并不是适合器模式的一部分, 不过这是一个起点.

需求变化了

现在客户的公司要向欧洲发展,所以需要开发一个应用, 能够用欧元完成同样的计算. 你希望这个欧元计算能够像DollarCalc一样, 所要做的就是改变变量名.

EuroCalc.php

<?phpclass EuroCalc{ private $euro; private $product; private $service; public $rate = 1; public function requestCalc($productNow, $serviceNow) {  $this->product = $productNow;  $this->service = $serviceNow;  $this->euro = $this->product + $this->service;  return $this->requestTotal(); } public function requestTotal() {  $this->euro *= $this->rate;  return $this->euro; }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表