介紹
? ? ? ? 外觀模式中外部與一個子系統(tǒng)的通信通過一個統(tǒng)一的外觀角色進行,為子系統(tǒng)中的一組接口提供一個一致的入口。外觀模式定義了一個高層接口,這個接口使得子系統(tǒng)更加容易使用。外觀模式又稱為門面模式,它是一種對象結構型模式。
實現
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <vector>
class SubSystemA {
public:
void methodA();
};
class SubSystemB {
public:
void methodB();
};
class Facade {
public:
Facade();
~Facade();
void method();
private:
SubSystemA *m_subA;
SubSystemB *m_subB;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
void SubSystemA::methodA() {
std::cout << "SubSystemA::methodA()" << std::endl;
}
void SubSystemB::methodB() {
std::cout << "SubSystemB::methodB()" << std::endl;
}
Facade::Facade() {
m_subA = new SubSystemA;
m_subB = new SubSystemB;
}
Facade::~Facade() {
if (m_subA) {
delete m_subA;
}
if (m_subB) {
delete m_subB;
}
}
void Facade::method() {
if (m_subA) {
m_subA->methodA();
}
if (m_subB) {
m_subB->methodB();
}
}
main.cpp
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
Facade *facade = new Facade();
facade->method();
return 0;
}
總結
優(yōu)點
? ? ? ? 1.?對客戶端屏蔽了子系統(tǒng)組件,減少了客戶端所需處理的對象數目并使得子系統(tǒng)使用起來更加容易。通過引入外觀模式,客戶端代碼將變得很簡單,與之關聯(lián)的對象也很少。
? ? ? ? 2.?實現了子系統(tǒng)與客戶端之間的松耦合關系,這使得子系統(tǒng)的變化不會影響到調用它的客戶端,只需要調整外觀類即可。
? ? ? ? 3.?一個子系統(tǒng)的修改對其他子系統(tǒng)沒有任何影響,而且子系統(tǒng)內部變化也不會影響到外觀對象。
? ? ? ? 4.?只是提供了一個訪問子系統(tǒng)的統(tǒng)一入口,并不影響客戶端直接使用子系統(tǒng)類。
缺點
? ? ? ? 1.?不能很好地限制客戶端直接使用子系統(tǒng)類,如果對客戶端訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性。
? ? ? ? 2.?如果設計不當,增加新的子系統(tǒng)可能需要修改外觀類的源代碼,這違背了開閉原則。
練習
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <vector>
class AddressBook {
public:
void moveTo(const std::string &path);
};
class MsgManager {
public:
void moveTo(const std::string &path);
};
class BackupFacade {
public:
BackupFacade();
~BackupFacade();
void backup(const std::string &path);
private:
AddressBook *m_addrBook;
MsgManager *m_msgManager;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp文章來源:http://www.zghlxwxcb.cn/news/detail-806054.html
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
void AddressBook::moveTo(const std::string &path) {
std::cout << "將通訊錄移動到" << path << std::endl;
}
void MsgManager::moveTo(const std::string &path) {
std::cout << "將短信移動到" << path << std::endl;
}
BackupFacade::BackupFacade() {
m_addrBook = new AddressBook;
m_msgManager = new MsgManager;
}
BackupFacade::~BackupFacade() {
if (m_addrBook) {
delete m_addrBook;
}
if (m_msgManager) {
delete m_msgManager;
}
}
void BackupFacade::backup(const std::string &path) {
std::cout << "------- 開始備份 ---------" << std::endl;
if (m_addrBook) {
m_addrBook->moveTo(path);
}
if (m_msgManager) {
m_msgManager->moveTo(path);
}
std::cout << "------- 備份完成 ---------" << std::endl;
}
main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-806054.html
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
BackupFacade *facade = new BackupFacade();
facade->backup("SD卡");
return 0;
}
到了這里,關于《設計模式的藝術》筆記 - 外觀模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!