
出租车起步价14元,包含3公里;晚上11点至次日清晨6点,起步价调整为18元,同样包含3公里。之后每公里2.5元。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
此地出租车实行分时段计费,白天起步价14元含首3公里,夜间(23:00-次日6:00)则升至18元,并同为前3公里内费用;超出后一律每公里加收2.5元。
设计一个出租车计费系统类(TaxiFareCalculator),该类应该能够根据给定的距离、时间以及是否在外环区域来计算费用,并且支持灵活的扩展性以适应未来可能的需求变化。
### 1. 设计要求
- **灵活性**:代码应能轻松调整费率和规则。
- **可扩展性**:便于添加新的功能或修改现有逻辑,例如增加高峰时段定价等。
### 2. 类设计
```python
class TaxiFareCalculator:
def __init__(self, base_fare_day=14, base_fare_night=18,
rate_after_3km_day=(2.5, 3.5), rate_after_3km_night=(3., 4.7),
waiting_fee_per_minute=.1):
self.base_fare_day = base_fare_day
self.base_fare_night = base_fare_night
self.rate_after_3km_day = rate_after_3km_day[0]
self.rate_after_10km_day = rate_after_3km_day[1]
self.rate_after_3km_night = rate_after_3km_night[0]
self.rate_after_10km_night = rate_after_3km_night[1]
self.waiting_fee_per_minute = waiting_fee_per_minute
def calculate_fare(self, distance_km, is_outer_ring=False,
start_time=None):
base_fare = self.base_fare_day
if (start_time.hour >= 23 or start_time.hour < 6): # 判断是否为夜间
base_fare = self.base_fee_night
fare_after_10km_rate = self.rate_after_10km_night \
if is_outer_ring else self.rate_after_10km_day
total_cost = base_fare + (distance_km - 3) * (
self.rate_after_3km_night if distance_km > 10 and is_outer_ring
else fare_after_10km_rate)
return round(total_cost, 2)
def calculate_waiting_fee(self, waiting_minutes):
计算等候费
fee = max(0, (waiting_minutes // 10) * self.waiting_fee_per_minute)
return round(fee, 2)
# 测试代码
if __name__ == __main__:
calculator = TaxiFareCalculator()
# 示例测试:白天3公里内乘车,无等候时间
print(calculator.calculate_fare(3))
# 晚上10公里外的行车费用,在外环区域,并且有25分钟等待时间
waiting_time_minutes = 25
fare_overnight_outer_ring = calculator.calculate_fare(
distance_km=18, is_outer_ring=True,
start_time=datetime.time(3))
total_cost_with_waiting_fee = \
fare_overnight_outer_ring + calculator.calculate_waiting_fee(waiting_time_minutes)
print(total_cost_with_waiting_fee)
```
以上代码通过`TaxiFareCalculator`类实现了出租车费用计算的功能,同时支持灵活的费率调整和等候费计算。此外,测试部分展示了如何使用这个类来模拟不同的场景以验证其正确性。
### 3. 设计模式
- **策略设计模式**:可以通过参数化的方式定义不同时间段或区域内的价格规则。
- **工厂方法(Factory Method)设计模式**:如果在未来需要支持多种类型的出租车计算模型,可以考虑使用此模式创建相应的对象实例。
全部评论 (0)


