php 適配器模式的學習筆記

來源:互聯網
上載者:User


【目的】:將一個類的介面轉換成客戶希望的另外一個介面,Adapter模式使得原來由於介面不相容而不能一起工作的那此類可以一起工作


【主要角色】

目標(Target)角色:定義用戶端使用的與特定領域相關的介面,這也就是我們所期待得到的
源(Adaptee)角色:需要進行適配的介面
適配器(Adapter)角色:對Adaptee的介面與Target介面進行適配;適配器是本模式的核心,適配器把源介面轉換成目標介面,此角色為具體類
【適用性】
1、你想使用一個已經存在的類,而它的介面不符合你的需求
2、你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類協同工作
3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面。對象適配器可以適配它的父類介面(僅限於對象適配器)

//目標角色 
interface Target { 
    public function simpleMethod1(); 
    public function simpleMethod2(); 

 
//源角色 
class Adaptee { 
     
    public function simpleMethod1(){ 
        echo 'Adapter simpleMethod1'."<br>"; 
    } 

 
//類適配器角色 
class Adapter implements Target { 
    private $adaptee; 
     
     
    function __construct(Adaptee $adaptee) { 
        $this->adaptee = $adaptee;  
    } 
     
    //委派調用Adaptee的sampleMethod1方法 
    public function simpleMethod1(){ 
        echo $this->adaptee->simpleMethod1(); 
    } 
     
    public function simpleMethod2(){ 
        echo 'Adapter simpleMethod2'."<br>";    
    }  
     

 
//用戶端 
class Client { 
     
    public static function main() { 
        $adaptee = new Adaptee(); 
        $adapter = new Adapter($adaptee); 
        $adapter->simpleMethod1(); 
        $adapter->simpleMethod2();  
    } 

 
Client::main();

 【運行結果】

Adapter simpleMethod1
Adapter simpleMethod2

例子2

生活中最常見到的足球換人機制

<?php
/**
* Created by PhpStorm.
*/
//-------------抽象介面---------------
/**抽象運動員
* Interface IPlayer
*/
interface SoccerPlayer
{
function Attack();
function Defense();
}
 
/**前鋒
* Class Forward
*/
class Forward implements SoccerPlayer
{
 
function Attack()
{
echo "前鋒攻擊<br/>";
}
 
function Defense()
{
echo "前鋒防禦<br/>";
}
}
 
/**中鋒
* Class Center
*/
class Center implements SoccerPlayer
{
 
function Attack()
{
echo "中鋒攻擊<br/>";
}
 
function Defense()
{
echo "中鋒防禦<br/>";
}
}
 
//--------------待適配對象-----------
/**梅西 剛進入罷賽的運動員
* Class Yaoming
*/
class Messi
{
function 進攻()
{
echo "梅西進攻<br/>";
}
 
function 防禦()
{
echo "梅西防禦<br/>";
}
}
 
//------------適配器--------------
/**適配器
* Class Adapter
*/
class Adapter implements SoccerPlayer
{
private $_player;
 
function __construct()
{
$this->_player=new Messi();
}
 
function Attack()
{
$this->_player->進攻();
}
 
function Defense()
{
$this->_player->防禦();
}
}

測試如下

$player1=new Forward();
 
echo "前鋒上場:<br/>";
$player1->Attack();
$player1->Defense();
 
echo "<hr/><br/>";
 
echo "梅西上場:<br/>";
$Messi=new Adapter();
$Messi->Attack();
$Messi->Defense();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.