问题分析
题目描述了一个旅游公司需要根据季节、节假日等因素推出不同的旅行定价包,如淡季打折、一口价等。这种需求涉及到根据不同的条件选择不同的定价策略。
适合的设计模式
这种需求非常适合使用策略模式(Strategy Pattern)。策略模式允许在运行时选择不同的算法或行为,从而实现灵活的定价策略。
策略模式的主要意图
策略模式的主要意图是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。这样,客户端可以在运行时选择不同的策略,而不需要修改代码。
选项分析
-
(46) 适合采用的模式
- A. 策略(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
- B. 状态(State):允许一个对象在其内部状态改变时改变它的行为。
- C. 观察者(Observer):当一个对象的状态发生改变时,依赖于它的对象都得到通知并被自动更新。
- D. 命令(Command):将一个请求封装为对象,从而可以用不同的请求对客户进行参数化。
根据题目描述,需要根据不同的条件选择不同的定价策略,因此策略模式是最适合的。
-
(47) 该模式的主要意图
- A. 将一个请求封装为对象,从而可以用不同的请求对客户进行参数化
- B. 当一个对象的状态发生改变时,依赖于它的对象都得到通知并被自动更新
- C. 允许一个对象在其内部状态改变时改变它的行为
- D. 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换
策略模式的主要意图是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
答案
- (46) 适合采用的模式:A. 策略(Strategy)
- (47) 该模式的主要意图:D. 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换
示例代码
以下是一个简单的策略模式示例,用于实现不同的定价策略:
// 定义策略接口
interface PricingStrategy {
double calculatePrice(double basePrice);
}
// 具体策略:淡季打折
class OffSeasonDiscountStrategy implements PricingStrategy {
@Override
public double calculatePrice(double basePrice) {
return basePrice * 0.8; // 打八折
}
}
// 具体策略:节假日一口价
class HolidayFixedPriceStrategy implements PricingStrategy {
private double fixedPrice;
public HolidayFixedPriceStrategy(double fixedPrice) {
this.fixedPrice = fixedPrice;
}
@Override
public double calculatePrice(double basePrice) {
return fixedPrice; // 一口价
}
}
// 上下文类
class TravelPackage {
private PricingStrategy pricingStrategy;
public TravelPackage(PricingStrategy pricingStrategy) {
this.pricingStrategy = pricingStrategy;
}
public void setPricingStrategy(PricingStrategy pricingStrategy) {
this.pricingStrategy = pricingStrategy;
}
public double calculateFinalPrice(double basePrice) {
return pricingStrategy.calculatePrice(basePrice);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
TravelPackage package = new TravelPackage(new OffSeasonDiscountStrategy());
double basePrice = 1000;
System.out.println("Off-season price: " + package.calculateFinalPrice(basePrice));
package.setPricingStrategy(new HolidayFixedPriceStrategy(1200));
System.out.println("Holiday fixed price: " + package.calculateFinalPrice(basePrice));
}
}
在这个示例中,PricingStrategy
是策略接口,OffSeasonDiscountStrategy
和 HolidayFixedPriceStrategy
是具体的策略类。TravelPackage
是上下文类,它使用策略接口来计算最终价格。客户端可以根据不同的条件选择不同的策略。
答案依次为:A、D。
解析
- 第46题:策略模式(Strategy)定义了一系列算法,将每个算法都封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户。在该旅游公司的软件系统中,根据不同季节、节假日等因素推出不同的旅行定价包,如淡季打折、一口价等,这些不同的定价方式可以看作是不同的算法,适合使用策略模式来实现。状态模式主要用于一个对象的行为随着其内部状态的改变而改变;观察者模式用于对象间的一对多依赖关系,当一个对象状态改变时,通知其他依赖它的对象;命令模式将请求封装为对象,以便将请求排队、记录日志或支持撤销操作等。所以本题选A。
- 第47题:策略模式的主要意图是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,这与选项D的描述一致。选项A是命令模式的意图;选项B是观察者模式的意图;选项C是状态模式的意图。所以本题选D。
- 下面是一个使用策略模式实现旅行定价的Python代码示例:
from abc import ABC, abstractmethod
# 定义折扣策略接口
class PricingStrategy(ABC):
@abstractmethod
def calculate_price(self, original_price: float) -> float:
pass
# 具体策略类:淡季折扣
class OffSeasonDiscount(PricingStrategy):
def calculate_price(self, original_price: float) -> float:
return original_price * 0.8 # 8折优惠
# 具体策略类:一口价
class FixedPrice(PricingStrategy):
def calculate_price(self, original_price: float) -> float:
return 999.99 # 固定价格
# 具体策略类:节假日全价
class HolidayPrice(PricingStrategy):
def calculate_price(self, original_price: float) -> float:
return original_price # 不打折
# 环境类:旅行套餐
class TravelPackage:
def __init__(self, name: str, original_price: float, strategy: PricingStrategy):
self.name = name
self.original_price = original_price
self.strategy = strategy
def set_strategy(self, strategy: PricingStrategy):
self.strategy = strategy
def get_final_price(self) -> float:
return self.strategy.calculate_price(self.original_price)
# 客户端代码
if __name__ == "__main__":
# 创建旅行套餐
package = TravelPackage("云南七日游", 1500.0, OffSeasonDiscount())
# 淡季价格
print(f"淡季价格: {package.get_final_price()} 元")
# 节假日价格
package.set_strategy(HolidayPrice())
print(f"节假日价格: {package.get_final_price()} 元")
# 特价活动
package.set_strategy(FixedPrice())
print(f"特价活动价格: {package.get_final_price()} 元")
代码说明
- 策略接口:
PricingStrategy
定义了计算价格的抽象方法calculate_price
。 - 具体策略类:
OffSeasonDiscount
:实现淡季8折优惠FixedPrice
:实现固定价格策略HolidayPrice
:实现节假日全价策略
- 环境类:
TravelPackage
维护一个策略对象,并根据当前策略计算最终价格。 - 客户端使用:通过设置不同的策略对象,可以灵活切换定价方式,而无需修改旅行套餐类的代码。
策略模式的优势
- 可扩展性:新增定价策略只需实现
PricingStrategy
接口,无需修改现有代码 - 解耦:算法的实现与使用分离,符合开闭原则
- 灵活性:运行时可动态切换策略,适应不同业务场景