• 浅析一道C++设计面试题


    问题描述:

      有一个饭店搞活动,普通客人吃饭打9折,银卡客户在此基础上再打8折,金卡客户再在此基础上打7折,问:该如何设计这个程序并用C++代码实现? 

      拿到这个题目后我的第一反应是使用一个抽象类提供一个打折操作的接口,然后普通客人、银卡客户和金卡客户分别实现该接口,在具体实现时使用多态来实现该功能,具体代码如下:

      使用这个方式后,自己还沾沾自喜,以为回答的很完美,不过仔细想一下,如果这时候需求变为所有的客人都在原价的基础上打折而不是在其他客户的基础上打折该怎么办?重新编写代码,然后修改折扣计算方法。哦~!这就违反了面向对象中“对修改关闭,对扩展开放”的原则,那该怎么解决呢?可以使用设计模式中的“装饰者模式”解决,关于装饰者模式的讨论请自行查找资料,代码如下:

      这里可以看出,如果打折方式变化,只需修改main中的代码,而不需修改类中任何代码。

    程序输出:

      在其他会员基础上打折的输出为:

     9
    7.2
    5.04
    请按任意键继续. . .

      在原价基础上打折的输出为:

    9
    8
    7
    请按任意键继续. . .

  • 相关阅读:
    Vue CLI Plugin Electron Builder 打包出现空白问题
    git 不小心提交大文件出错问题
    electron-vue创建项目
    electron ico文件问题
    多尺寸ico图标制作工具GIMP
    ps ico图标制作插件
    fluent-ffmpeg
    CopyWebpackPlugin 拷贝某个文件夹的文件到某个文件夹
    electron-vue 目录有中文打包报错问题
    js 给控件新增class
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167922.html
Copyright © 2020-2023  润新知