设计模式-策略模式

本文介绍了设计模式中的策略模式,通过一个电影院打折系统的案例,展示了如何利用策略模式解决算法选择的问题,以提高代码的可扩展性和复用性。在策略模式中,环境类Context与抽象策略类Strategy以及具体策略类ConcreteStrategy相互作用,使得算法可以在运行时动态切换,避免了复杂的条件选择语句,遵循了开闭原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Java设计模式》

前言:

俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出
旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实
际情况(目的地、旅游预算、旅游时间等)来选择一种最适合的出行方式。在制订旅行计划
时,如果目的地较远、时间不多,但不差钱,可以选择坐飞机去旅游;如果目的地虽远、但
假期长、且需控制旅游成本时可以选择坐火车或汽车;如果从健康和环保的角度考虑,而且
有足够的毅力,自行车游或者徒步旅游也是个不错的选择,大笑。

在软件开发中,我们也常常会遇到类似的情况,实现某一个功能有多条途径,每一条途径对
应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增
加新的解决途径。本章我们将介绍一种为了适应算法灵活性而产生的设计模式——策略模
式。

概念:

策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互
替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一
种对象行为型模式。

角色:

● Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时
可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策
略。
● Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可
以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具
体策略类中实现的算法。
● ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策
略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

案例:

Sunny软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供
不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠;
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠
送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
为了实现上述电影票打折功能,Sunny软件公司开发人员设计了一个电影票类MovieTicket,其
核心代码片段如下所示:

//电影票类
class MovieTicket {
   
	private double price; //电影票价格
	private String type; //电影票类型
public void setPrice(double price) {
   
	this.price = price;
}
public void setType(String type) {
   
	this.type = type;
}
public double getPrice() {
   
	return this.calculate();
}
//计算打折之后的票价
public double calculate() {
   
	//学生票折后票价计算
	if(this.type.equalsIgnoreCase("student")) {
   
		System.out.println("学生票:");
		return this.price * 0.8;
	}
	//儿童票折后票价计算
	else if(this.type.equalsIgnoreCase("children") && this.price >= 20 ) {
   
		System.out.println("儿童票:");
		return this.price - 10;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值