zoukankan      html  css  js  c++  java
  • 浅析一道C++设计面试题

    问题描述:

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

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

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

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

    程序输出:

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

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

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

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

  • 相关阅读:
    把KB转化为KB及以上单位
    php自动获取上一个月的起始时间
    CentOS 7.2mini版本下编译安装php7.4.6+MySQL5.7.14+Nginx1.18.0
    JS 根据子网掩码,网关计算出所有的IP范围
    php 在字符串指定位置插入新字符
    PHP实现文件下载
    JS 日期与时间戳相互转化
    MySQL中有关char、varchar、int、tinyint、decimal
    数据库设计三范式
    利用递归实现 两个队列实现一个栈的教程 写的超级详细小白都能看懂!
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167922.html
Copyright © 2011-2022 走看看