通过C++程序示例理解设计模式中的外观模式

作者:黄花寒 时间:2022-02-06 19:38:15 

举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去 n个地方办理 n 个手续(现在大学合并后就更加麻烦,因为可能那 n 个地方都隔的比较远)。

但是实际上我们需要的就是一个最后一道手续的证明而已,对于前面的手续是怎么办的、到什么地方去办理我们都不感兴趣。

实际上在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块),而这些接口(模块)都分布在几个类中(比如 A 和 B、C、D):A 中实现了一些接口,B 中实现一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后你的客户程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D 的类的接口,他并不想知道这些接口在哪里实现的。

这里的客户程序员就是上面生活中想办理手续的郁闷的人!在现实生活中我们可能可以很快想到找一个人代理所有的事情就可以解决你的问题(你只要维护和他的简单的一个接口而已了!),在软件系统设计开发中我们可以通过一个叫做 Facade 的模式来解决上面的问题。

我们通过外观模式解决上面的问题,其典型的结构图为:

通过C++程序示例理解设计模式中的外观模式

外观模式的想法、思路和实现都非常简单,但是其思想却是非常有意义的。并且外观设计模式在实际的开发设计中也是应用最广、最多的模式之一。

应用示例:
     假如你想吃一顿大餐,那么我想你要,首先去买菜,然后回到家后自己做菜,最后吃完饭以后要洗碗打扫。
     这么一来你需要3个类,Shopper, Cook, Dishwasher, 分别来完成买菜,做菜,洗碗等工作,显然这非常麻烦,能不能简化这个过程?当然可以!去餐馆吃。
     餐馆这时候显然就是外观模式了,他把复杂的过程封装到内部,用户不用关心细节。

实现代码:
Shopper 采购类


class Shopper
{
public:
void shopForGroceries()
{
 cout<<"买菜"<<endl;
}

};

Cook 厨师类


class Cook
{
public:
void doCook()
{
 cout<<"做饭"<<endl;
}

};


洗碗工类 Dishwasher


class Dishwasher
{
public:
void washDish()
{
 cout<<"洗碗"<<endl;
}
};

餐馆类


class Restaurant
{
public:
Restaurant()
{

}
void haveAMeal()
{
 m_shopper.shopForGroceries();
 m_cook.doCook();
 m_washer.washDish();
}
private:
Shopper m_shopper;
Cook m_cook;
Dishwasher m_washer;
};

客户端:


Restaurant rt;
rt.haveAMeal();
标签:C++,设计模式
0
投稿

猜你喜欢

  • Java模拟有序链表数据结构的示例

    2023-09-26 22:25:30
  • SpringBoot项目的配置文件中设置server.port不生效问题

    2022-11-13 06:01:26
  • C++超详细讲解贪心策略的设计及解决会场安排问题

    2022-07-26 12:08:04
  • C#递归实现显示文件夹及所有文件并计算其大小的方法

    2023-09-13 01:56:01
  • C# Web应用调试开启外部访问步骤解析

    2023-04-01 15:24:01
  • Java Durid进行JDBC连接详解

    2022-09-25 02:35:12
  • Java算法设计与分析分治算法

    2022-04-02 08:07:15
  • Java开发人员需知的十大戒律

    2023-09-17 07:33:50
  • 新手小心:c语言中强符号与弱符号的使用

    2023-06-24 15:16:23
  • java中计算字符串长度的方法及u4E00与u9FBB的认识

    2022-07-15 18:28:20
  • java使用回溯法求解数独示例

    2023-08-17 14:39:10
  • React Native与Android 原生通信的方法

    2021-08-11 19:02:56
  • 详解C# 反射(Reflection)

    2021-09-08 14:42:59
  • JavaWeb中JavaMail创建邮件和发送邮件

    2022-01-29 02:54:09
  • Java ==,equals()与hashcode()的使用

    2022-02-24 07:06:28
  • Java非法字符: ‘\\ufeff‘问题及说明

    2023-02-01 09:06:07
  • Unity实现换装系统

    2021-08-11 15:27:15
  • 深入Android MediaPlayer的使用方法详解

    2023-07-21 21:50:47
  • Java 并发编程之线程挂起、恢复与终止

    2022-02-18 11:51:51
  • C#设置Word文档背景的三种方法(纯色/渐变/图片背景)

    2022-07-08 01:33:09
  • asp之家 软件编程 m.aspxhome.com