這個模式一直以來都有一個很經典的例子,那就是插座!沒錯,當咱們從國外買回來電器,或者旅遊出差去國外的時候,常常會須要一個電源適配器,由於我國的電壓標準是220伏,而其餘國家則有110伏的標準。而這個電源適配器正是適配器模式的一種標誌。當對象不太符合要求的時候,給他加一個適配器唄!!php
GoF定義:將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做git
GoF類圖github
繼承式編程
組合式設計模式
代碼實現安全
interface Target{
function Request() : void;
}
複製代碼
定義一個接口契約,也能夠是一個正常的有實現方法的類(後面的例子咱們會用類)this
class Adapter implements Target{
private $adaptee;
function __constuct($adaptee){
$this->adaptee = $adaptee;
}
function Request() : void {
$this->adaptee->SpecificRequest();
}
}
複製代碼
適配器實現這個接口契約,讓Request()方法得以實現,但請注意,咱們真正調用的實際上是Adaptee類中的方法阿里雲
class Adaptee {
function SpecificRequest() : void{
echo "I'm China Standard!";
}
}
複製代碼
又說到個人手機工廠了,這回我們的生意真的作大了哦!賣到泰國、新加坡、印度尼西亞去了,反正有咖喱的地方都有咱們的身影了。聽說是咱們出了個咖喱色。換殼這事兒可不徹底是由於受到諾X亞的影響,而是真的通過長期的調研咱們發現不一樣顏色在不一樣的地方銷量會更好。因而,富X康在原有的手機殼生產線(Target)上爲咱們加裝了一個噴塗適配器(adapter),當咱們須要其餘顏色的殼時,只須要這個適配器換不一樣的顏料就好啦(adaptee),直接裝上這個噴塗器,新的顏色的手機就誕生了。而當向另一個國家擴展業務時,咱們換顏料就行啦,用過久了不行就連噴頭也換掉(是否是想起了連供打印機)spa
完整代碼:適配器模式設計
繼續發短信,看我能編到何時~~~
各位大拿在對接信息、支付類的接口時,常常會使用這些平臺提供的SDK。特別是有了Composer以後,安裝SDK就更加的方便了,可是,又有一個嚴重的問題,這幫人作的SDK雖然說功能實現大同小異,但命名但是千差萬別啊!!咱們的系統原來一直使用的阿里雲的業務,可是這回要增長極光和百度雲的信息功能,一來作個後備,二來根據不一樣業務使用不一樣的接口達到安全或節約的目的,有沒有辦法統一一下他們對外的接口,讓咱們使用他們的SDK時可以很是方便的和以前使用你們都已經很習慣的阿里雲的接口同樣呢?固然有,給他們各自都上個適配器唄,實例化的時候大不了外面再套個工廠返回不一樣的適配器就好啦,只要適配器裏的實現方法和阿里雲同樣就OK啦!
短信發送類圖
完整源碼:短信發送適配器方法
<?php
class Message{
public function send(){
echo "阿里雲發送短信!" . PHP_EOL;
}
public function push(){
echo "阿里雲發送推送!" . PHP_EOL;
}
}
class JiguangSDKAdapter extends Message{
private $message;
public function __construct($message){
$this->message = $message;
}
public function send(){
$this->message->send_out_msg();
}
public function push(){
$this->message->push_msg();
}
}
class JiguangMessage{
public function send_out_msg(){
echo "極光發送短信!" . PHP_EOL;
}
public function push_msg(){
echo "極光發送推送!" . PHP_EOL;
}
}
class BaiduYunSDKAdapter extends Message{
private $message;
public function __construct($message){
$this->message = $message;
}
public function send(){
$this->message->transmission_msg();
}
public function push(){
$this->message->transmission_push();
}
}
class BaiduYunMessage{
public function transmission_msg(){
echo "百度雲發送短信!" . PHP_EOL;
}
public function transmission_push(){
echo "百度雲發送推送!" . PHP_EOL;
}
}
$jiguangMessage = new JiguangMessage();
$baiduYunMessage = new BaiduYunMessage();
$message = new Message();
// 原來的老系統發短信,使用阿里雲
$message->send();
$message->push();
// 部分模塊用極光發吧
$jgAdatper = new JiguangSDKAdapter($jiguangMessage);
$jgAdatper->send();
$jgAdatper->push();
// 部分模塊用百度雲發吧
$bdAatper = new BaiduYunSDKAdapter($baiduYunMessage);
$bdAatper->send();
$bdAatper->push();
複製代碼
說明
事件訂閱有沒有據說過?沒有?若是地震算一個事件的話,那麼一旦發生這個災難了,立刻會有種類政府部門和社會團隊開始行動,救援、搶險等各類工做立刻展開,咱們能夠把整個社會力量都當作是訂閱者,包括咱們每個都會很關心災區的狀況。在這裏,咱們全部人都是觀察者。這下就很容易理解觀察者模式了吧,下節咱們再詳述!