適配器模式 有時(shí)候也稱包裝樣式或者包裝。將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的。一個(gè)適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類別自己的接口包裹在一個(gè)已存在的類中。
有兩類適配器模式:
·對(duì)象適配器模式 - 在這種適配器模式中,適配器容納一個(gè)它我包裹的類的實(shí)例。在這種情況下,適配器調(diào)用被包裹對(duì)象的物理實(shí)體。
·類適配器模式 - 這種適配器模式下,適配器繼承自已實(shí)現(xiàn)的類(一般多重繼承)。facade 為外部提供一致的界面,但不改動(dòng)邏輯語義
圖1:類模式適配器

圖2:對(duì)象模式適配器

外觀模式 為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的高層接口,使得子系統(tǒng)更容易使用。
在cocos2d-x中,SimpleAudioEngine是一個(gè)外觀模式。它將不同平臺(tái)的通用的音頻操作整合為一致的接口。
來自維基百科的實(shí)現(xiàn):http://zh.wikipedia.org/wiki/%E5%A4%96%E8%A7%80%E6%A8%A1%E5%BC%8F

class CPU {
public:
void freeze() {

}
void jump(
long position) {

}
void execute() {

}
}
class Memory {
public:
void load(
long position,
char* data) {

}
}
class HardDrive {
public:
char* read(
long lba,
int size) {

}
}
/* Façade */ class Computer {
public:
void startComputer() {
cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
}
}
/* Client */ class You {
public:
void start(String[] args) {
Computer facade =
new Computer();
facade.startComputer();
}
}
外觀模式 與 適配器模式 的區(qū)別在于,適配器是為了使得一個(gè)已經(jīng)存在的類在邏輯上成為另外一種類;而外觀模式只是為了將邏輯相同,但是底層細(xì)節(jié)不同的接口轉(zhuǎn)化為統(tǒng)一的接口,起語義邏輯不變。