本文实例讲述了PHP设计模式之适配器模式原理与用法。分享给大家供大家参考,具体如下:
一、什么是适配器模式
适配器模式有两种:类适配器模式和对象适配器模式。其中类适配器模式使用继承方式,而对象适配器模式使用组合方式。由于类适配器模式包含双重继承,而PHP并不支持双重继承,所以一般都采取结合继承和实现的方式来模拟双重继承,即继承一个类,同时实现一个接口。类适配器模式很简单,但是与对象适配器模式相比,类适配器模式的灵活性稍弱。采用类适配器模式时,适配器继承被适配者并实现一个接口;采用对象适配器模式时,适配器使用被适配者,并实现一个接口。
二、什么时候使用适配器模式
适配器模式的作用就是解决兼容性问题,如果需要通过适配(使用多重继承或组合)来结合两个不兼容的系统,那就使用适配器模式。
三、类适配器模式
以货币兑换为例:
<?php/*** 类适配器模式* 以货币兑换为例**///美元计算类class DollarCalc{ private $dollar; private $product; private $service; public $rate = 1; public function requestCalc($product,$service) { $this->product = $product; $this->service = $service; $this->dollar = $this->product + $this->service; return $this->requestTotal(); } public function requestTotal() { $this->dollar *= $this->rate; return $this->dollar; }}//欧元计算类class EuroCalc{ private $euro; private $product; private $service; public $rate = 1; public function requestCalc($product,$service) { $this->product = $product; $this->service = $service; $this->euro = $this->product + $this->service; return $this->requestTotal(); } public function requestTotal() { $this->euro *= $this->rate; return $this->euro; }}//欧元适配器接口interface ITarget{ function requester();}//欧元适配器实现class EuroAdapter extends EuroCalc implements ITarget{ public function __construct() { $this->requester(); } function requester() { $this->rate = .8111; return $this->rate; }}//客户类class Client{ private $euroRequest; private $dollarRequest; public function __construct() { $this->euroRequest = new EuroAdapter(); $this->dollarRequest = new DollarCalc(); $euro = ""; echo "Euros: $euro" . $this->makeAdapterRequest($this->euroRequest) . "<br />"; echo "Dollars: $" . $this->makeDollarRequest($this->dollarRequest); } private function makeAdapterRequest(ITarget $req) { return $req->requestCalc(40,50); } private function makeDollarRequest(DollarCalc $req) { return $req->requestCalc(40,50); }}$client = new Client();?>
运行结果:
Euros: 72.999
Dollars: $90
四、对象适配器模式
以桌面环境转向移动环境为例:
<?php/*** 对象适配器模式* 从桌面环境转向移动环境**///桌面布局接口interface IFormat{ public function formatCSS(); public function formatGraphics(); public function horizontalLayout();}//桌面布局类实现class Desktop implements IFormat{ public function formatCSS() { //调用桌面布局CSS文件 } public function formatGraphics() { //调用图片 } public function horizontalLayout() { //桌面水平布局 }}//移动布局接口interface IMobileFormat{ public function formatCSS(); public function formatGraphics(); public function verticalLayout();}//移动布局类实现class Mobile implements IMobileFormat{ public function formatCSS() { //调用移动布局CSS文件 } public function formatGraphics() { //调用图片 } public function verticalLayout() { //移动垂直布局 }}//移动布局适配器class MobileAdapter implements IFormat{ private $mobile; public function __construct(IMobileFormat $mobile) { $this->mobile = $mobile; } public function formatCSS() { $this->mobile->formatCSS(); } public function formatGraphics() { $this->mobile->formatGraphics(); } public function horizontalLayout() { $this->mobile->verticalLayout(); }}//客户类class Client{ private $mobile; private $mobileAdapter; public function __construct() { $this->mobile = new Mobile(); $this->mobileAdapter = new MobileAdapter($this->mobile); $this->mobileAdapter->formatCSS(); $this->mobileAdapter->formatGraphics(); $this->mobileAdapter->horizontalLayout(); }}$client = new Client();?>
希望本文所述对大家PHP程序设计有所帮助。
新闻热点
疑难解答
图片精选