• 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();
    ?>
    

      

    四、对象适配器模式

      以桌面环境转向移动环境为例:

    <?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();
    ?>
    

      

     

  • 相关阅读:
    document.createElement在IE和Firefox下的差异
    css3:基础知识
    XMLTProcessor根据XSLT样式规则将节点转换为document对象
    Sql:查看数据库表和表结构的语句
    前端性能优化方法总结
    vue-resource 设置请求的参数以formData形式以及设置请求的过滤器
    vuex
    vue 随笔3
    vuex
    vue随笔2
  • 原文地址:https://www.cnblogs.com/wujuntian/p/4906593.html
Copyright © 2020-2023  润新知