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;}

输出:

开始制定行程
旅游路线匹配状态: 开始匹配
旅游路线匹配状态: 匹配适合的时间
旅游路线匹配状态: 匹配适合的路程
旅游路线匹配状态: 匹配适合的地点
旅游路线匹配状态: 完成
**旅游路线匹配完成,接下来匹配就近酒店**
酒店预订状态: 开始匹配
酒店预订状态: 查找景点附近酒店
酒店预订状态: 匹配合适的价格
酒店预订状态: 预订酒店
酒店预订状态: 预定完成
**附近酒店匹配完成,接下来匹配附近景点**
景点匹配状态: 开始匹配
景点匹配状态: 查找当地景点
景点匹配状态: 指定路线
景点匹配状态: 制定路线完成
**附近景点匹配完成,接下来开始订票流程**
车票预订状态: 开始订票
车票预订状态: 核对车票信息
车票预订状态: 核对用户信息
车票预订状态: 订票
车票预订状态: 核对支付信息
车票预订状态: 订票完成
**订票完成,旅游计划制定结束**

优缺点

    个人觉得外观模式是比较简单的设计模式,其要解决的问题和优点也有突出,就是将客户端和复杂的子系统分离,通过外观来解耦,使代码易于维护。

适用场景

    适用于客户端调用复杂子系统的应用场景。

原创粉丝点击