练习03 创建型+结构型+其它(以step0_src中代码为基础)
1. 在代码中大量地使用了cout, 这限定了程序只能输出到控制台屏幕,同时也限定了程序中大部分类只能在控制台程序中被复用。为更好提高Menu等类的复用性,并适应多种输出设备,如输出到流设备(含控制台)、输出到打印机、输出到窗口等, 可以将输出独立出来。请根据给出的类图,设计并实现相关类(PrinterDevice、WindowDevice不用实现,暂不考虑cin的处理),并修改原程序,使得输出结果不变。
2. 若希望输出各菜单时,左端都增加一些空格或Tab,使得显示更美观一些,如下图所示。请使用装饰模式扩展1中的类。
转变成
3. 考虑1中的PrinterDevice,若系统中没有本地打印机,而是使用网络打印机;在网络上打印机有多台,当有打印需要时,由系统根据情况选择一台打印。现希望维持OutDevice等类接口的一致,同时让用户在适应打印设备时,感觉与本地打印“一样”。请使用代理模式,给出相关部分的类图并简要加以说明。
4. 现希望在Process各Menu时,增加一些额外的操作:如在菜单之前显示一个Head,例如主菜单可能显示为:
=========================
= =
=========================
主菜单
1: New
2: Load
3: Save
4: Option
5: Play..."
6: Change To EF
0: Exit
Your selected:
也可能在菜单显示时,循环播放背景音乐,离开菜单时,停止播放。
现将Menu中的Process改为virtual,通过复用已有的各Menu,给Menu增加一些额外的功能。请使用装饰模式进行扩展,使得Process各Menu时,都循环播放背景音乐,离开菜单时,停止播放;同时显示主菜单时,显示如上图(Window下可使用PlaySound API函数,另由于LoadMenu类名与Windows中的LoadMenu API函数重名,可将菜单LoadMenu 类改为其它名字或使用名字空间避免重名)。
5. 现添加Player。作为Demo,可设为2-3个player,如第1号是HumanPlayer;第2号玩家是AutoPlayer,第3号玩家是AutoPlayer。当选择MainMenu->Play时,各Player依次Play;轮到AutoPlayer时,显示当前Map,然后转下一个player;轮到HumanPlayer时,显示PlayMenu菜单,如下:
PlayMenu
1. Go…
2. Load
3. Save
4. Back To MainMenu
Your selected:
选择1时,显示当前Map; 选择2时,进入LoadMenu;选择3时,进入SaveMenu (SaveMenu可从MainMenu的子菜单中移除掉);选择4时,进入MainMenu。请完成实现代码。实现时,需将MainMenu的子菜单SaveMenu移到PlayMenu的子菜单;修改LoadMenu的动作,当返回时,不再返回到MainMenu,而是直接执行MainMenu的Play过程;
1