C++设计模式——外观模式
来源:互联网 发布:四川大学软件学院考研 编辑:程序博客网 时间:2024/06/06 23:53
C++设计模式——外观模式
概念
外观模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。它是为子系统中的一组接口所提供的一个一致的界面。
场景描述
现在有很多旅游软件都有类似于一键出行的功能。系统会去自动搜寻匹配适合的或者是热门的旅游景点,并给你订好对应景点附近的酒店等,规划好去景点的路线,并且最后把火车票给你订好。那么这样的功能如何实现呢?
一步一步到外观模式
我们抛开设计模式不说,刚遇到上述需求的时候,我们首先会想着怎么去实现它呢?首先我们得实现一个匹配合适景点或热门景点的子系统;然后我们再去实现一个匹配景点附近酒店的子系统;然后我们再实现一个规划路径的系统;最后实现一个订票的系统。当我们点击一键出行的时候,客户端依次去调用这四个子系统的接口函数即可。
本以为这样实现已经完美了,但是如果有一天,需求增加了,经理要求在这个功能上增加一个寻找驴友结伴而行的功能。要求软件能匹配去相同地方旅游的驴友。这时候我们是不是得再去实现这个寻找驴友的功能,完了客户端再在合适的地方去调用它呢?为了避免客户端调用复杂的子系统,我们为客户端提供了一个统一的接口,如此便是外观模式。不管子系统多复杂,对于客户端来说,只有一个统一的外观接口。具体实现代码如下:
//Common.h 申明通用全局变量#ifndef COMMON_H_#define COMMON_H_#include <iostream>const std::string g_journeyPlanState[] = {"开始匹配","匹配适合的时间","匹配适合的路程","匹配适合的地点","完成"};const std::string g_hotelPlanState[] = {"开始匹配","查找景点附近酒店","匹配合适的价格","预订酒店","预定完成"};const std::string g_itineraryState[] = {"开始匹配","查找当地景点","指定路线","制定路线完成"};const std::string g_BookTicketState[] = {"开始订票","核对车票信息","核对用户信息","订票","核对支付信息","订票完成"};#endif
//JourneyPlan.h 实现四大子系统和其外观#ifndef JOURNEYPLAN_H_#define JOURNEYPLAN_H_#include <iostream>#include <Windows.h>#include "Common.h"using namespace std;//旅游路线匹配子系统class JourneyPlan{public: JourneyPlan(){m_state = 0;} bool CheckState() { cout << "旅游路线匹配状态: " << g_journeyPlanState[m_state].c_str() <<endl; Sleep(1000); return m_state++ == Complete; }private: enum State { Start = 0, MatchTime, MatchPath, MatchAddress, Complete }; int m_state;};//酒店匹配子系统class HotelPlan{public: HotelPlan() { m_state = 0; } bool CheckState() { cout << "酒店预订状态: " << g_hotelPlanState[m_state].c_str() <<endl; Sleep(1000); return m_state++ == Complete; }private: enum State { Start = 0, MatchHotel, MatchPrice, BookHotel, Complete }; int m_state;};//景点路线匹配子系统class ItineraryPlan{public: ItineraryPlan() { m_state = 0; } bool CheckState() { cout << "景点匹配状态: " << g_itineraryState[m_state].c_str() <<endl; Sleep(1000); return m_state++ == Complete; }private: enum State { Start = 0, SearchSpot, PlanItinerary, Complete }; int m_state;};//订票子系统class TicketBook{public: TicketBook() { m_state = 0; } bool CheckState() { cout << "车票预订状态: " << g_BookTicketState[m_state].c_str() <<endl; Sleep(1000); return m_state++ == Complete; }private: enum State { Start = 0, CheckTicket, CheckIdentify, BookTicket, CheckPayInfo, Complete }; int m_state;};//外观类class JourneyPlayFacade{public: JourneyPlayFacade() { m_state = 0; } bool CheckState() { switch (m_state) { case Start: cout<<"开始制定行程"<<endl; m_state++; case Journey: if (m_journeyPlan.CheckState()) { m_state++; cout << "**********旅游路线匹配完成,接下来匹配就近酒店**********" << endl; } break; case Hotel: if (m_hotelPlan.CheckState()) { m_state++; cout << "**********附近酒店匹配完成,接下来匹配附近景点**********" << endl; } break; case Itinerary: if (m_itineraryPlan.CheckState()) { m_state++; cout << "**********附近景点匹配完成,接下来开始订票流程**********" << endl; } break; case Ticket: if (m_ticketBook.CheckState()) { m_state++; cout << "**********订票完成,旅游计划制定结束**********" << endl; } break; case Complete: return true; default: break; } return false; }private: enum State { Start, Journey, Hotel, Itinerary, Ticket, Complete }; int m_state; JourneyPlan m_journeyPlan; HotelPlan m_hotelPlan; ItineraryPlan m_itineraryPlan; TicketBook m_ticketBook;};#endif
//客户端调用#include <iostream>#include "JourneyPlan.h"using namespace std;int main(){ JourneyPlayFacade facade; while(!facade.CheckState());//只需要调用外观接口,无需管理子系统的复杂类。 return 0;}
输出:
开始制定行程
旅游路线匹配状态: 开始匹配
旅游路线匹配状态: 匹配适合的时间
旅游路线匹配状态: 匹配适合的路程
旅游路线匹配状态: 匹配适合的地点
旅游路线匹配状态: 完成
**旅游路线匹配完成,接下来匹配就近酒店**
酒店预订状态: 开始匹配
酒店预订状态: 查找景点附近酒店
酒店预订状态: 匹配合适的价格
酒店预订状态: 预订酒店
酒店预订状态: 预定完成
**附近酒店匹配完成,接下来匹配附近景点**
景点匹配状态: 开始匹配
景点匹配状态: 查找当地景点
景点匹配状态: 指定路线
景点匹配状态: 制定路线完成
**附近景点匹配完成,接下来开始订票流程**
车票预订状态: 开始订票
车票预订状态: 核对车票信息
车票预订状态: 核对用户信息
车票预订状态: 订票
车票预订状态: 核对支付信息
车票预订状态: 订票完成
**订票完成,旅游计划制定结束**
优缺点
个人觉得外观模式是比较简单的设计模式,其要解决的问题和优点也有突出,就是将客户端和复杂的子系统分离,通过外观来解耦,使代码易于维护。
适用场景
适用于客户端调用复杂子系统的应用场景。
- 设计模式—外观模式
- 设计模式—外观模式
- 设计模式—外观模式
- 设计模式——外观模式(C++)
- 每日设计模式——外观模式
- 浅谈设计模式——外观模式
- 设计模式——外观模式(Facade)
- 设计模式——外观模式
- JAVA设计模式——外观模式
- java设计模式——外观模式
- 设计模式——外观模式
- 结构性设计模式——外观模式
- 设计模式——外观模式
- 设计模式——外观模式
- 设计模式(4)——外观模式
- C++设计模式——外观模式
- 设计模式——外观模式(FacadePattern)
- 设计模式——外观模式
- 从源码剖析一个Spark WordCount Job执行的全过程
- Java并发编程:Timer和TimerTask
- tortoisegit如何退回原来的版本及回退远端
- linux多线程调用同一个函数解析
- FileZilla Server 设置
- C++设计模式——外观模式
- Android 一款简单的视频的播放器
- Reading Note: Be Your Own Prada: Fashion Synthesis with Structural Coherence
- C++笔记
- unable to get local issuer certificate code60
- 程序员编程生涯中常会犯的7个错误
- Sqoop异常解决ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: No
- CoDeSys简介
- synchronized在JVM底层的实现原理及Java多线程锁理解