请选择一种我们课程中介绍的设计模式,用您熟悉的编程语言提供一个典型的应用范例,并分析其代码结构特性。完成一篇研究报告,具体要求如下:
在课堂上,孟老师介绍了外观模式,孟老师给出的例子是在socket编程中,把那些用到的函数用宏定义重新命名,咋一看会觉得这不是画蛇添足、多此一举吗?实际上不然,因为在Linux系统下和在Windows系统下进行socket编程用到的库函数是不一样的,函数名也有一些不同, 但实现的功能是差不多的,如果对程序进行移植,从两种系统中切换,不使用外观模式,不重新进行宏定义,将会有大量的函数名需要改动,而使用外观模式,只需要对外观类(在socket编程这里是宏定义替代外观类)进行更改即可。在这篇博文中我将对外观模式进行探讨。
这里举个例子,假如我们有三种机器人,可以扫地,唱歌,跳舞,如果我们不设计一个外观类,我们就需要在调用时分别生成三个机器人类,然后调用。
现在我们设计一个机器人管家类,对三种机器人进行管理,我们在调用时就只需要吩咐机器人管家,机器人管家会把命名传达给三种机器人,三种机器人再分别执行自己接受到的命令。
示例代码如下:
#include<iostream> using namespace std; class Robot { //机器人类作为父类 public: virtual void doSomeThing(){} }; //三种不同的机器人类,他们都继承自机器人类 class CleanRobot :public Robot { public: virtual void doSomeThing() { cout << "clean the room" << endl; } }; class MusicRobot :public Robot { public: virtual void doSomeThing() { cout << "play music" << endl; } }; class DanceRobot :public Robot { public: virtual void doSomeThing() { cout << "show a dance" << endl; } }; //机器人管家类,作为外观类 class RobotManager { private: Robot* cleanRobot; Robot* musicRobot; Robot *danceRobot; public: RobotManager() { cleanRobot = new CleanRobot(); musicRobot = new MusicRobot(); danceRobot = new DanceRobot(); } void clean() { cleanRobot->doSomeThing(); } void music() { musicRobot->doSomeThing(); } void dance() { danceRobot->doSomeThing(); } }; //主函数中只要生成一个机器人管家类,向机器人管家类下达指令就可以指挥三种机器人工作了 int main() {
// CleanRobot cleanRobot;
// MusicRobot musicRobot;
// DanceRobot danceRobot;
// cleanRobot.doSomeThing();
// musicRobot.doSomeThing();
// danceRobot.doSomeThing();
RobotManager robotManager = RobotManager(); robotManager.clean(); robotManager.music(); robotManager.dance(); return 0; }
GitHub版本库地址:https://github.com/sequelOoO/facadePattern
参考资料:菜鸟教程 https://www.runoob.com/design-pattern/design-pattern-tutorial.html
原文:https://www.cnblogs.com/xujih/p/11992007.html