既存のクラス用のアダプタが、ケースには、インターフェイスの変更を交換したくありませんでした。モード等が挙げられるが、異なるアプリケーション目的に装飾模様。
Benpian例:
米国の電気の電圧は、あなたが米国に中国の電気製品を使用する場合、中国は220Vで、110Vですが、220Vに110Vアダプター、それ以外の電化製品を使用することはできませんがあるはずです。(Emmmは、どのように奇妙な、それを読むために、私は証拠を持っていません)
最初の方法:オブジェクトアダプタ
interface Target
{
public function volt110();
public function other();
public function volt220();
}
/**
* Class Adaptee 被适配者
*/
class Adaptee
{
public function volt110()
{
echo '110V<br>';
}
public function other()
{
echo '我是其它操作<br>';
}
}
/**
* Class Adapter 适配器
*/
class Adapter implements Target
{
private $_adaptee;
public function __construct(Adaptee $adaptee)
{
$this->_adaptee = $adaptee;
}
public function volt110()
{
$this->_adaptee->volt110();
}
public function other()
{
$this->_adaptee->other();
}
public function volt220()
{
echo '220V<br>';
}
}
$adapter = new Adapter(new Adaptee());
$adapter->volt110(); // 想用110V就用110V,该类(Adaptee)在系统已存在并大规模使用了,修改它的逻辑判断与传参,可能会导致某些地方异常。
$adapter->volt220(); // 想用220V就增加22OV,在需要增加新的同类型操作时,但处理的数据不同,增加一个接口,再用适配器类(Adapter)实现该接口。使他们为同一个接口。
$adapter->other(); // 假装有其它操作
これは、同じインターフェイスを呼び出すことができます。
これをしないでください、あなたは必要なAdaptee
220Vのクラス(クラスの外を構築するためにAdapter
新たに再び使用する場合、)。あなたは新しいインターフェイスに追加する前に、今、ちょうど、あなたが団結に呼び出すことができますする必要があります。
一般的には、新しいクラス(同じメソッドは、クラスを置くことができただろう)の名前のためのインタフェース仕様、クラスがインタフェース、統一された呼び出しを追加します。
第二の方法:クラスのアダプタ。より良い上記の文を理解するために
interface Target2
{
public function volt110();
public function volt220();
}
class Adaptee2
{
public function volt110()
{
echo '110V<br>';
}
public function other()
{
echo '我是其它操作<br>';
}
}
class Adapter2 extends Adaptee2 implements Target2
{
public function volt220()
{
echo '220V<br>';
}
}
$adapter2 = new Adapter2();
$adapter2->volt110();
$adapter2->volt220();
$adapter2->other();