【聲明】本題目來源于卡碼網(wǎng)(題目頁面 (kamacoder.com))
【提示:如果不想看文字介紹,可以直接跳轉(zhuǎn)到C++編碼部分】
【簡介】什么是外觀模式
????????外觀模式Facade Pattern , 也被稱為“??模式”,是?種結(jié)構(gòu)型設(shè)計(jì)模式,外觀模式定義了?個(gè)?層接?,這個(gè)接?使得?系統(tǒng)更容易使?,同時(shí)也隱藏了?系統(tǒng)的復(fù)雜性。
????????----??模式可以將?系統(tǒng)關(guān)在“??”隱藏起來,客戶端只需要通過外觀接?與外觀對象進(jìn)?交互,?不需要直接和多個(gè)?系統(tǒng)交互,?論?系統(tǒng)多么復(fù)雜,對于外部來說是隱藏的,這樣可以降低系統(tǒng)的耦合度。
????????舉個(gè)例?,假設(shè)你正在編寫的?個(gè)模塊?來處理?件讀取、解析、存儲(chǔ),我們可以將這個(gè)過程拆成三部分,然后創(chuàng)建?個(gè)外觀類,將?件系統(tǒng)操作、數(shù)據(jù)解析和存儲(chǔ)操作封裝在外觀類中,為客戶端提供?個(gè)簡化的接?,如果后續(xù)需要修改?件處理的流程或替換底層?系統(tǒng),也只需在外觀類中進(jìn)?調(diào)整,不會(huì)影響客戶端代碼。
【基本結(jié)構(gòu)】
????????外觀模式的基本結(jié)構(gòu)?較簡單,只包括“外觀”和“?系統(tǒng)類”:
- 外觀類:對外提供?個(gè)統(tǒng)?的?層次接?,使復(fù)雜的?系統(tǒng)變得更易使?。
- ?系統(tǒng)類:實(shí)現(xiàn)?系統(tǒng)的功能,處理外觀類指派的任務(wù)。
?【簡易實(shí)現(xiàn)步驟】
下?使?Java代碼實(shí)現(xiàn)外觀模式的通?結(jié)構(gòu):
1. 子系統(tǒng)A
// ?系統(tǒng)A
class SubsystemA {
public void operationA() {
System.out.println("SubsystemA operation");
}
}
2. 子系統(tǒng)B
// ?系統(tǒng)B
class SubsystemB {
public void operationB() {
System.out.println("SubsystemB operation");
}
}
3. 子系統(tǒng)C
// ?系統(tǒng)C
class SubsystemC {
public void operationC() {
System.out.println("SubsystemC operation");
}
}
4. 外觀類
// 外觀類
class Facade {
private SubsystemA subsystemA;
private SubsystemB subsystemB;
private SubsystemC subsystemC;
public Facade() {
this.subsystemA = new SubsystemA();
this.subsystemB = new SubsystemB();
this.subsystemC = new SubsystemC();
}
// 外觀?法,封裝了對?系統(tǒng)的操作
public void facadeOperation() {
subsystemA.operationA();
subsystemB.operationB();
subsystemC.operationC();
}
}
5. 客戶端代碼
// 客戶端
public class Main {
public static void main(String[] args) {
// 創(chuàng)建外觀對象
Facade facade = new Facade();
// 客戶端通過外觀類調(diào)??系統(tǒng)的操作
facade.facadeOperation();
}
}
????????在上?的代碼中, Facade 類是外觀類,封裝了對三個(gè)?系統(tǒng)SubSystem 的操作。客戶端通過調(diào)?外觀類的?法來實(shí)現(xiàn)對?系統(tǒng)的訪問,?不需要直接調(diào)??系統(tǒng)的?法。
【優(yōu)缺點(diǎn)和使用場景】
????????外觀模式通過提供?個(gè)簡化的接?,隱藏了系統(tǒng)的復(fù)雜性,降低了客戶端和?系統(tǒng)之間的耦合度,客戶端不需要了解系統(tǒng)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也不需要直接和多個(gè)?系統(tǒng)交互,只需要通過外觀接?與外觀對象進(jìn)?交互。
????????但是如果需要添加新的?系統(tǒng)或修改?系統(tǒng)的?為,就可能需要修改外觀類,這違背了“開閉原則”。
????????外觀模式的應(yīng)?也?分普遍,下??種情況都使?了外觀模式來進(jìn)?簡化。
- Spring框架是?個(gè)?泛使?外觀模式的例?。Spring框架提供了?個(gè)?量的功能,包括依賴注?、?向切?編程(AOP)、事務(wù)管理等。Spring的ApplicationContext 可以看作是外觀,隱藏了底層組件的復(fù)雜性,使得開發(fā)者可以更輕松地使?Spring的功能。
- JDBC提供了?個(gè)?于與數(shù)據(jù)庫交互的接?。DriverManager 類可以看作是外觀,它簡化了數(shù)據(jù)庫驅(qū)動(dòng)的加載和連接的過程,隱藏了底層數(shù)據(jù)庫連接的復(fù)雜性。
- Android系統(tǒng)的API中也使?了外觀模式。例如, Activity 類提供了?個(gè)外觀,使得開發(fā)者可以更容易地管理應(yīng)?的?命周期,??需關(guān)?底層的事件和狀態(tài)管理。
【編碼部分】
1. 題目描述
????????小明家的電源總開關(guān)控制了家里的三個(gè)設(shè)備:空調(diào)、臺(tái)燈和電視機(jī)。每個(gè)設(shè)備都有獨(dú)立的開關(guān)密碼,分別用數(shù)字1、2和3表示。即輸入1時(shí),空調(diào)關(guān)閉,輸入2時(shí),臺(tái)燈關(guān)閉,輸入3時(shí),電視機(jī)關(guān)閉,當(dāng)輸入為4時(shí),表示要關(guān)閉所有設(shè)備。請你使用外觀模式編寫程序來描述電源總開關(guān)的操作。
2. 輸入描述
????????第一行是一個(gè)整數(shù) N(1 <= N <= 100),表示后面有 N 行輸入。接下來的 N 行,每行包含一個(gè)數(shù)字,表示對應(yīng)設(shè)備的開關(guān)操作(1表示關(guān)閉空調(diào),2表示關(guān)閉臺(tái)燈,3表示關(guān)閉電視機(jī),4表示關(guān)閉所有設(shè)備)。
3. 輸出描述
????????輸出關(guān)閉所有設(shè)備后的狀態(tài),當(dāng)輸入的數(shù)字不在1-4范圍內(nèi)時(shí),輸出Invalid device code.
4. C++編碼實(shí)例
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file FacadeMode.hpp
* @brief 外觀模式
* @autor 寫代碼的小恐龍er
* @date 2024/01/11
*/
#include <iostream>
#include <string>
using namespace std;
// 前置聲明
// 子系統(tǒng)1 -- 空調(diào)
class AirConditioner;
// 子系統(tǒng)2 -- 臺(tái)燈
class Light;
// 子系統(tǒng)3 -- 電視機(jī)
class TV;
// 外觀模式的管理類 -- 接口類的派生類
class FacadePowerSwitch;
// 子系統(tǒng)1 -- 空調(diào)
class AirConditioner
{
public:
void TurnOff(){
std::cout << "Air Conditioner is turned off." << endl;
}
};
// 子系統(tǒng)1 -- 空調(diào)
class Light
{
public:
void TurnOff(){
std::cout << "Desk Lamp is turned off." << endl;
}
};
// 子系統(tǒng)1 -- 空調(diào)
class TV
{
public:
void TurnOff(){
std::cout << "Television is turned off." << endl;
}
};
// 外觀模式的管理類 -- 接口類的派生類
class FacadePowerSwitch
{
// 成員數(shù)據(jù)
private:
AirConditioner *_airConditioner;
Light *_light;
TV *_tv;
// 成員函數(shù)
public:
// 重載構(gòu)造函數(shù) 和 析構(gòu)函數(shù)
FacadePowerSwitch()
{
_airConditioner = new AirConditioner();
_light = new Light();
_tv = new TV();
}
~FacadePowerSwitch(){
if(_airConditioner != nullptr) {
delete _airConditioner;
_airConditioner = nullptr;
}
if(_light != nullptr) {
delete _light;
_light = nullptr;
}
if(_tv != nullptr) {
delete _tv;
_tv = nullptr;
}
}
// 子系統(tǒng)業(yè)務(wù)代碼
void TurnOffContion(int orderType){
switch(orderType)
{
case 1:
_airConditioner->TurnOff();
break;
case 2:
_light->TurnOff();
break;
case 3:
_tv->TurnOff();
break;
case 4:
std::cout << "All devices are off." << endl;
break;
default:
std::cout << "Invalid device code." << endl;
break;
}
}
};
int main()
{
// 指令值個(gè)數(shù)
int orderNum = 0;
std::cin >> orderNum;
// 創(chuàng)建外觀管理類對象
FacadePowerSwitch *facadePowerSwitch = new FacadePowerSwitch();
for(int i = 0; i < orderNum; i++)
{
// 指令值
int orderType = 0;
std::cin >> orderType;
//并調(diào)用業(yè)務(wù)函數(shù)
facadePowerSwitch->TurnOffContion(orderType);
}
delete facadePowerSwitch;
facadePowerSwitch = nullptr;
return 0;
}
......文章來源:http://www.zghlxwxcb.cn/news/detail-798391.html
To be continued.文章來源地址http://www.zghlxwxcb.cn/news/detail-798391.html
到了這里,關(guān)于C++ 設(shè)計(jì)模式之外觀模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!