浅析一道C++设计面试题
问题描述:
有一个饭店搞活动,普通客人吃饭打9折,银卡客户在此基础上再打8折,金卡客户再在此基础上打7折,问:该如何设计这个程序并用C++代码实现?
拿到这个题目后我的第一反应是使用一个抽象类提供一个打折操作的接口,然后普通客人、银卡客户和金卡客户分别实现该接口,在具体实现时使用多态来实现该功能,具体代码如下:
使用这个方式后,自己还沾沾自喜,以为回答的很完美,不过仔细想一下,如果这时候需求变为所有的客人都在原价的基础上打折而不是在其他客户的基础上打折该怎么办?重新编写代码,然后修改折扣计算方法。哦~!这就违反了面向对象中“对修改关闭,对扩展开放”的原则,那该怎么解决呢?可以使用设计模式中的“装饰者模式”解决,关于装饰者模式的讨论请自行查找资料,代码如下:
这里可以看出,如果打折方式变化,只需修改main中的代码,而不需修改类中任何代码。
程序输出:
在其他会员基础上打折的输出为:
9
7.2
5.04
请按任意键继续. . .
在原价基础上打折的输出为:
9
8
7
请按任意键继续. . .